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   -

Bonjour,


Je prepare un projet de fin d'étude où il faut que je remplisse une base de données MySQL à partir d'un fichier texte. J'ai créé la base de données et j'ai établi la connexion entre Java et MySql avec mysql_connector. Il ne me reste maintenant qu'à remplir la base.

J'ai essayé ce code, mais il donne une 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();
    }
}


Répondez-moi s'il vous plaît, je suis bloqué !

Merci

1 réponse

Résumé de la discussion

Le problème est de remplir une base MySQL à partir d'un fichier texte en Java après l'établissement de la connexion via MySQL Connector et de faire correspondre les champs avec les colonnes. Plusieurs avis techniques indiquent que l'extraction échoue lors du traitement des lignes et de la conversion des dates, notamment à cause d'un mélange de BufferedReader, StringTokenizer et la gestion des exceptions. La solution préconisée privilégie l'utilisation de Scanner pour lire les lignes, le découpage par tabulations et la gestion des ParseException dans une méthode stringToDate sécurisée. Des conseils ajoutent aussi de traiter les valeurs manquantes, d'éviter les erreurs d'URL ou d'entier en vérifiant chaque champ avant l'insertion et en terminant proprement les flux d'entrée.

Bobot (l'IA à votre service)
  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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();
    }
    0
    1. HighPaula Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
       

      J'ai essayé votre suggestion mais elle ne remplit pas la base de donnée MySQL. Même s'il n'y a pas d'erreur ! Aidez-moi, s'il vous plaît.

      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      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.
      0
    3. HighPaula Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
       

      Voilà 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");
      		}
      	}
      }
      
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      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);
      0
    5. HighPaula Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
       

      Ça ne marche toujours pas. Je ne sais pas pourquoi !

      0