2017-09-26 12 views
0

J'ajouter du texte codé dans Windows 1252 dans un fichier CSV ainsi:différents encodages chaque fois que j'ajouter à un fichier CSV

public static final Charset CHARSET = Charset.forName("Windows-1252"); 


public void dumpToCSV(final List<String[]> content, 
         final char delimiter, 
         final String enc, 
         final int csvDays) { 

    File file = new File(Constants.CSV_FILENAME); 

    // Convert the Character Format before dumping to file: 
    try (
     OutputStreamWriter os = new OutputStreamWriter(
      new FileOutputStream(file, true), 
      CHARSET); 
     CSVWriter cw = new CSVWriter(os, delimiter)) { 

     // Remove old lines 
     clearCsvByDays(file, csvDays, Character.toString(delimiter)); 
     // Dump new content into file. 
     cw.writeAll(content); 
    } catch (IOException e) {} 
} 

private void clearCsvByDays(final File file, final int csvDays, final String delim) 
      throws IOException { 

    List<String> out = Files.lines(file.toPath(), CHARSET) 
          .filter(line -> mustFilter(line, csvDays, delim)) 
          .collect(Collectors.toList()); 
    Files.write(file.toPath(), out, 
       StandardOpenOption.WRITE, 
       StandardOpenOption.TRUNCATE_EXISTING); 
} 

La première écriture dans le fichier, le résultat est comme prévu, les caractères sont encodés en Windows-1252 et sont bien affichés sur le programme cible. Le second vidage, il ajoute les nouvelles données sur UTF-8, je ne sais pas pourquoi.

"Éspáñà tëst";"ADN";"26-09-2017";"0";"0";"0";"0" <-- 2nd dump (new) 
"ʳpⲠ t촴";"ADN";"26-09-2017";"0";"0";"0";"0"  <-- 1st dump (old) 

La troisième décharge, il ajoute les nouvelles données sur un autre codage différent, mais conserve la première ligne correcte de dumping sur Windows-1252.

"Ãspáñà tëst";"ADN";"26-09-2017";"0";"0";"0";"0" <-- 3rd dump (new) 
"Éspáñà tëst";"ADN";"26-09-2017";"0";"0";"0";"0"  <-- 2nd dump (old) 
"ʳpⲠ t촴";"ADN";"26-09-2017";"0";"0";"0";"0"   <-- 1st dump (old) 

Si je continue d'ajouter, chaque fois que c'est un codage différent.

Pourquoi cela se produit-il et comment puis-je le réparer?

+0

D'où vient 'content' venir? – Berger

+0

Les premières valeurs proviennent d'un fichier .properties, elles doivent donc être renseignées manuellement. Toutes les valeurs 0 proviennent d'une réponse WS. – another

+0

Vous utilisez 'CSVWriter' pour écrire les données, mais ce n'est pas une classe Java standard. Y a-t-il un bug dans sa mise en œuvre? Difficile à dire sans connaître le code. – toongeorges

Répondre

3

CSVWriter a reçu un OutputStreamWriter correct.

En écriture, Files.write a également besoin d'un encodage.

Files.write(file.toPath(), out, CHARSET, 
    StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); 

Je pense hacks ailleurs:

new String(string.getBytes(...), ...) 
+0

J'ai édité la question parce que j'ai trouvé la solution: P. Merci pour l'aide. J'allais poster cette même réponse :). – another