Probléme StringTokenizer
HighPaula
Messages postés
24
Statut
Membre
-
HighPaula Messages postés 24 Statut Membre -
HighPaula Messages postés 24 Statut Membre -
Bonjour,
Je prepare un projet de fin d'etude ou il faut que je remplit une base de donné mySql a partir d'un fichier Texte . J'ai Crée la base de donnée et j'ai etabli la connection entre Java et MySql Avec MySql_Connector ! Il me reste maintenant que Remplir La Base !
J'ai essayé ce code My il donne un erreur :
FileReader fr ;
BufferedReader br;
StringTokenizer Line ;
StringTokenizer Mot ;
String idu;
String idq;
Date dateq;
String url;
String ItemRank;
public Fichier(String NomFichier) {
Sql base = new Sql("com.mysql.jdbc.Driver","jdbc:mysql://localhost/pfe-base");
base.connect("root","");
try {
this.fr = new FileReader(NomFichier);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
br = new BufferedReader(fr);
}
public static java.util.Date stringToDate(String sDate) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
return sdf.parse(sDate);
}
public void extraction() throws Exception{
Line = new StringTokenizer(br.toString(),"\n");
Mot = new StringTokenizer(Line.toString(),"\t");
while(Line.hasMoreTokens()){
while(Mot.hasMoreTokens()) {
idu = Mot.nextToken().toString();
idq = Mot.nextToken().toString();
// C'est Ici Que Eclipse m'annonce l'erreur !
dateq = stringToDate(Mot.nextToken().toString());
ItemRank = Mot.nextToken().toString();
url = Mot.nextToken().toString();}
//base.update("INSERT INTO URL VALUES(idu,idq,url,dateq,ItemRank);");
}
Line.nextToken();
}
Repondez Moi Svp !! Je suis Bloquééééé ! Merci
Je prepare un projet de fin d'etude ou il faut que je remplit une base de donné mySql a partir d'un fichier Texte . J'ai Crée la base de donnée et j'ai etabli la connection entre Java et MySql Avec MySql_Connector ! Il me reste maintenant que Remplir La Base !
J'ai essayé ce code My il donne un erreur :
FileReader fr ;
BufferedReader br;
StringTokenizer Line ;
StringTokenizer Mot ;
String idu;
String idq;
Date dateq;
String url;
String ItemRank;
public Fichier(String NomFichier) {
Sql base = new Sql("com.mysql.jdbc.Driver","jdbc:mysql://localhost/pfe-base");
base.connect("root","");
try {
this.fr = new FileReader(NomFichier);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
br = new BufferedReader(fr);
}
public static java.util.Date stringToDate(String sDate) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
return sdf.parse(sDate);
}
public void extraction() throws Exception{
Line = new StringTokenizer(br.toString(),"\n");
Mot = new StringTokenizer(Line.toString(),"\t");
while(Line.hasMoreTokens()){
while(Mot.hasMoreTokens()) {
idu = Mot.nextToken().toString();
idq = Mot.nextToken().toString();
// C'est Ici Que Eclipse m'annonce l'erreur !
dateq = stringToDate(Mot.nextToken().toString());
ItemRank = Mot.nextToken().toString();
url = Mot.nextToken().toString();}
//base.update("INSERT INTO URL VALUES(idu,idq,url,dateq,ItemRank);");
}
Line.nextToken();
}
Repondez Moi Svp !! Je suis Bloquééééé ! Merci
1 réponse
Ta méthode stringToDate lève Exception (en fait ce serait plutôt ParseException), il faut que tu traites cette exception avant qu'elle ne provoque l'arrêt du programme.
Remarques :
Par convention les noms de variables doivent commencer par une minuscule
Depuis Java 5, tu disposes de la classe Scanner, qui te simplifie la vie, pour ne pas avoir à utiliser la combinaison BufferedReader/StringTokenizer qui est lourde !
private final static SimpleDateFormat SDF = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
public static Date stringToDate(String sDate)
{
try
{
return SDF.parse(sDate);
}
catch (ParseException e)
{
e.printStackTrace();
return null;
}
}
Remarques :
Par convention les noms de variables doivent commencer par une minuscule
Depuis Java 5, tu disposes de la classe Scanner, qui te simplifie la vie, pour ne pas avoir à utiliser la combinaison BufferedReader/StringTokenizer qui est lourde !
public void extraction() throws FileNotFoundException
{
Scanner fic = new Scanner(new File(nomFichier));
while (fic.hasNextLine())
{
String idu, idq, itemRank, url;
Date dateq;
Scanner sc = new Scanner(fic.nextLine()).useDelimiter("\t");
while (sc.hasNext())
{
//if (sc.hasNext())
idu = sc.next();
//else break;
if (sc.hasNext())
idq = sc.next();
else break;
if (sc.hasNext())
dateq = stringToDate(sc.next());
else break;
if (sc.hasNext())
itemRank = sc.next();
else break;
if (sc.hasNext())
url = sc.next();
else break;
//base.update("INSERT INTO URL VALUES(idu,idq,url,dateq,ItemRank);");
}
sc.close();
}
fic.close();
}
Pour le problème d'ajout à la base de donnée, donne moi le code de la classe Sql, ou l'import que tu as fait pour pouvoir l'utiliser.
import java.sql.*;
import javax.swing.JOptionPane;
public class Sql {
Connection conn;
Statement stmt;
PreparedStatement pStmt;
ResultSet rs;
String driver ;
String url ;
public Sql(String driver,String url){
this.driver = driver;
this.url = url ;
}
public void connect(String log, String pass)
{
try
{
Class.forName(driver);
conn = DriverManager.getConnection(url,log,pass);
stmt = conn.createStatement();
System.out.println("La Connection a reussi");
}
catch ( SQLException E)
{
JOptionPane.showMessageDialog(null,"Erreur de connexion à la base","Connexion",JOptionPane.WARNING_MESSAGE);
System.out.println("1");
}
catch ( ClassNotFoundException E)
{
E.printStackTrace();
}
}
// Méthode qui renvoit un ResultSet pour une requête
// @args -> la requete
public ResultSet getQuery(String query)
{
try
{
rs = stmt.executeQuery(query);
}
catch (SQLException E)
{
JOptionPane.showMessageDialog(null,"Erreur de connexion à la base. Veuillez contacter votre administrateur système","Connexion",JOptionPane.WARNING_MESSAGE);
System.out.println("2");
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
}
return rs;
}
public void update(String query) throws SQLException
{
stmt.executeUpdate(query);
}
// Méthode qui renvoit le nombre d'enregistrements affectés
// par un objet PreparedStatement
// @args -> le PreparedStatement
public int update(PreparedStatement p)
{
int r = 0;
try
{
pStmt = p;
r = pStmt.executeUpdate();
}
catch (SQLException E)
{
JOptionPane.showMessageDialog(null,"Erreur de connexion à la base","Connexion",JOptionPane.WARNING_MESSAGE);
System.out.println("6");
}
return r;
}
public void disconnect()
{
try
{
rs.close();
stmt.close();
conn.close();
}
catch ( SQLException E)
{
JOptionPane.showMessageDialog(null,"Erreur de connexion à la base","Connexion",JOptionPane.WARNING_MESSAGE);
System.out.println("14");
}
}
}
base.update("INSERT INTO URL VALUES(idu,idq,url,dateq,ItemRank);");Je pense que pour prendre en compte les valeurs des champs, il faudrait plutôt écrire ceci :
base.update("INSERT INTO URL VALUES("+idu+","+idq+","+url+","+ dateq.toString+","+ItemRank+");");Il serait également intéressant de récupérer la valeur de retour de la commande et de filtrer l'exception :
public int update(String query) { try { return stmt.executeUpdate(query); } catch (SQLException e) { e.printStackTrace(); return -1; } } int n = base.update(...); System.out.println(n);