Probléme StringTokenizer
HighPaula
Messages postés
23
Date d'inscription
Statut
Membre
Dernière intervention
-
HighPaula Messages postés 23 Date d'inscription Statut Membre Dernière intervention -
HighPaula Messages postés 23 Date d'inscription Statut Membre Dernière intervention -
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.
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(); }-
-
Ton problème initial ne portait pas sur le remplissage de la base de données, tu avais mis la ligne en commentaire, et je l'ai laissé tel quel... Est-ce que l'exception sur la lecture du fichier est corrigée ?
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. -
Le Voila Le Code de la Classe SQL !!
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");
}
}
} -
Je reprends ton premier code, mais j'ignore s'il est toujours d'actualité :
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); -
-