2016-11-13 3 views
2

J'ai un fichier texte que j'utilise pour stocker des informations sur les éléments.Comment supprimer une ligne vide à la fin du fichier?

10325,Test1,Producto del Hogar,12,17 
10425,Test2,Videojuegos,11,17 
12345,Test3,Producto del Hogar,56,17.0 

J'utilise la bibliothèque opencsv pour modifier une colonne de l'élément souhaité, je suis en utilisant ce code:

public void updateCSV(String replace, int fila, int col) throws IOException { 
    if (replace != null) { 
     File archivoProductos = new File("productos.txt"); 
     // Read existing file 
     CSVReader reader = new CSVReader(new FileReader(archivoProductos), ',', CSVWriter.NO_QUOTE_CHARACTER, 
       CSVWriter.NO_ESCAPE_CHARACTER); 
     List<String[]> csvBody = reader.readAll(); 
     // get CSV row column and replace with by using row and column 
     csvBody.get(fila)[col] = replace; 
     reader.close(); 
     // Write to CSV file which is open 
     CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', CSVWriter.NO_QUOTE_CHARACTER, 
       CSVWriter.NO_ESCAPE_CHARACTER, System.getProperty("line.separator")); 
     writer.writeAll(csvBody); 
     writer.flush(); 
     writer.close(); 

    } 
} 

Le problème est que lorsque la modification est faite, on ajoute un ligne vide à la fin du fichier texte.

line1 10325,Test99,Producto del Hogar,12,17 
line3 10425,Test2,Videojuegos,11,17 
line2 12345,Test3,Producto del Hogar,56,17.0 
line4 

Comment puis-je éviter la ligne vide ajoutée à la fin?

Ajouté println de csvBody avant qu'il l'écrit sur

[10325, Test99, Producto del Hogar, 12, 17] 
[10425, Test2, Videojuegos, 11, 17] 
[12345, Test3, Producto del Hogar, 56, 17.0] 

Essayé jusqu'à présent:

Ne pas ajouter la ligne vide, mais mes 3 lignes existantes sont maintenant écrites en un ligne.

CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', 
        CSVWriter.NO_QUOTE_CHARACTER, 
        CSVWriter.NO_ESCAPE_CHARACTER,""); 
+0

À quoi ressemble csvBody avant de l'écrire? vous pouvez utiliser des instructions d'impression pour voir. –

+0

Pouvez-vous essayer avec ça? CSVWriter writer = nouveau CSVWriter (nouveau FileWriter (archivoProductos), ',', CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER); – developer

+0

J'ai mis à jour le post, comme vous pouvez le voir il n'y a pas de ligne vide dans le csvBody, Si je supprime la ligne vide et que je veux modifier une autre ligne, la ligne vide sera de retour. @melgart –

Répondre

0

Peut-être que vous souhaitez insérer un test afin de ne pas écrire la finale ...

System.getProperty ("line.separator")

... s'il y a plus de données. Ou, et cela peut s'exécuter plus rapidement, il suffit de découper le dernier caractère séparateur avant d'écrire/enregistrer le fichier.

0

Le problème est votre personnage de saut de ligne, donc au lieu de System.getProperty("line.separator"), vous devez envoyer l'alimentation en ligne (dernier argument) que « » pour le constructeur CSVWriter comme indiqué ci-dessous:

//Pass Empty string as line feed at the end 
CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', 
        CSVWriter.NO_QUOTE_CHARACTER, 
        CSVWriter.NO_ESCAPE_CHARACTER,""); 
+0

Merci de continuer à m'aider! Malheureusement mes 3 lignes existantes sont écrites en 1 ligne [email protected] –

+0

désolé pour cela, laissez-moi vérifier – developer

0

Ok recherche donc à D'un point de vue légèrement différent, je vous demanderais pourquoi envoyez-vous le System.getProperty ("line.separator") - et la réponse à cela est que le système sur lequel vous êtes utilise un séparateur de ligne autre que le retour à la ligne "\ n" .

Ce que je soupçonne, c'est que l'éditeur que vous utilisez ne gère pas bien le nouveau saut de ligne. Si vous êtes sur un système * Nix (Linux, Unix, BSD, Mac, etc) exécutez "wc -l" pour obtenir un nombre réel de lignes et voir si cela revient avec un trois ou quatre. Sinon, essayez un éditeur différent.

Une autre possibilité est de faire un hexdump de votre fichier d'entrée et de voir s'il y a une nouvelle ligne supplémentaire. Il se pourrait que ce soit le cas et que le lecteur prenne cela comme un enregistrement supplémentaire, vide, et que le CSVWriter l'écrive consciencieusement. Si c'est le cas, vous devrez écrire une logique pour parcourir la liste après sa lecture et supprimer celles qui sont vides avant d'écrire. Je pense que c'est le vrai coupable ici.