2012-10-10 2 views
0

Je dois traiter un gros fichier texte (600 Mo environ) afin de le formater correctement, en écrivant la sortie formatée dans un nouveau fichier texte. Le problème est que l'écriture du contenu dans le nouveau fichier s'arrête à environ 6,2 Mo. Voici le code:Java - Impossible de terminer l'écriture du fichier texte

/* Analysis of the text in fileName to see if the lines are in the correct format 
    * (Theme\tDate\tTitle\tDescription). If there are lines that are in the incorrect format, 
    * the method corrects them. 
    */ 
    public static void cleanTextFile(String fileName, String destFile) throws IOException { 
     OutputStreamWriter writer = null; 
     BufferedReader reader = null; 

     try { 
      writer = new OutputStreamWriter(new FileOutputStream(destFile), "UTF8"); 
     } catch (IOException e) { 
      System.out.println("Could not open or create the file " + destFile); 
     } 

     try { 
      reader = new BufferedReader(new FileReader(fileName)); 
     } catch (FileNotFoundException e) { 
      System.out.println("The file " + fileName + " doesn't exist in the folder."); 
     } 

     String line; 
     String[] splitLine; 
     StringBuilder stringBuilder = new StringBuilder(""); 

     while ((line = reader.readLine()) != null) { 
      splitLine = line.split("\t"); 
      stringBuilder.append(line); 

      /* If the String array resulting of the split operation doesn't have size 4, 
      * then it means that there are elements of the news item missing in the line 
      */ 
      while (splitLine.length != 4) { 
       line = reader.readLine(); 
       stringBuilder.append(line); 

       splitLine = stringBuilder.toString().split("\t"); 
      } 
      stringBuilder.append("\n"); 
      writer.write(stringBuilder.toString()); 
      stringBuilder = new StringBuilder(""); 

      writer.flush(); 
     } 

     writer.close(); 
     reader.close(); 

    } 

Je l'ai déjà cherché des réponses, mais le problème est généralement lié au fait que l'auteur n'a pas été fermée ou l'absence de la méthode flush(). Par conséquent, je pense que le problème est dans le BufferedReader. Qu'est-ce que je rate?

+1

Avez-vous essayé correctement avec chasse d'eau ..? – OmniOwl

+0

J'ai d'abord essayé d'utiliser le rinçage après un certain nombre de fois (500 pour être exact), en espérant éviter le rinçage à chaque itération du cycle, mais cela n'a pas fonctionné. Quelle est la bonne façon d'utiliser Flush? – Judas

+0

Pourriez-vous fournir au moins quelques enregistrements à partir du fichier d'entrée (celui qui a 600 Mo)? – Jagger

Répondre

3

Regardez cette boucle:

while (splitLine.length != 4) { 
    line = reader.readLine(); 
    stringBuilder.append(line); 

    splitLine = stringBuilder.toString().split("\t"); 
} 

Si vous finissez toujours avec plus de 5 articles en splitLine, vous continuez à lire des données pour toujours ... vous ne remarquerez même pas lorsque vous Avons atteint la fin du fichier, car vous continuerez à ajouter null au StringBuilder. Je ne sais pas si c'est ce qui se passe (nous ne savons pas à quoi ressemblent vos données) mais c'est certainement faisable, et vous devriez vous en prémunir.

(Vous devez également utiliser un try/finally bloc pour les ressources de fermeture, mais c'est une autre question.)

+0

Cela a fonctionné, l'homme était une erreur stupide. Je viens de changer l'opérateur de '! =' À '<'. Merci. – Judas

+1

@Judas: Eh bien, ce n'est pas clair que c'est * vraiment * le bon correctif - et si vous arrivez à la fin du fichier, il va * toujours * itérer pour toujours. J'ai diagnostiqué le problème, mais vous devrez peut-être réfléchir plus attentivement à la solution. –

+0

Il a écrit tout le contenu dans le fichier et il n'y avait aucun problème avec la fin du fichier. Encore, un autre problème a émergé, mais je devrais aller bien maintenant. Merci encore! – Judas

0

séparé le FileOutputStream comme il est propre variable et fermez aussi:

FileOutputStream fos = new FileOutputStream(destFile); 
writer = new OutputStreamWriter(fos); 

    ... 

writer.flush(); 
fos.flush(); 
0
  1. Le try/catch n'est pas bien codé, en cas d'erreur le processus continue.
  2. Vous pouvez remplacer

    stringBuilder = new StringBuilder(""); 
    

    par

    stringBuilder.setLength(0); 
    
  3. Utilisez votre propre analyseur line.indexOf('\t',from) en place de String.split()

  4. Ajouter les pièces obtenues avec line.substring (b, e) a Liste < Chaîne>
  5. Utiliser un flux PrintStream avec un caractère correct set tère, utilisez le constructeur avec deux paramètres
  6. Écrivez les informations 4 par 4, la consommation de données de la liste, lorsque list.size()> = 4
Questions connexes