J'écris un fichier csv en utilisant un écrivain en mémoire tampon en Java. Mes données sont écrites correctement, mais je veux avoir différentes colonnes sous lesquelles les données sont fournies. Actuellement, chaque instance de date est écrite sur une ligne, mais n'est pas séparée par des colonnes.
Le code est
DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
File file = new File( dirName + "\\"+ df.format(new Date()) +"_Statistics.csv");
if ( !file.exists() )
file.createNewFile();
FileWriter fw = new FileWriter(file);
writer = new BufferedWriter( fw );
writer.write("Message Source");
writer.write("Message Name");
writer.write("Component");
writer.write("Occurance");
writer.write("Message Payload");
writer.write("Bandwidth (Payload)");
writer.write("Message Payload with Header");
writer.write("Bandwidth (Payload with Header)");
writer.newLine();
for (Signal signal : messages) {
writer.write(signal.getSource());
writer.write(signal.getName());
writer.write(signal.getComponent());
writer.write(Integer.toString(signal.getOccurance()));
writer.write(Integer.toString(signal.getSize()));
writer.write(Float.toString(signal.getBandwidth()));
writer.write(Integer.toString(signal.getSizewithHeader()));
writer.write(Float.toString(signal.getBandwidthWithHeader()));
writer.newLine();
}
writer.flush();
writer.close();
fw.close();
Existe-t-il un moyen de séparer la colonne de données afin qu’elle soit correctement lisible?
MODIFIER
Au lieu d'utiliser un script d'écriture tamponné, j'utilise la bibliothèque CSVReader
pour Java. http://www.csvreader.com/Java_csv.php Le code est maintenant
DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
File file = new File( dirName + "\\"+ df.format(new Date()) +"_Statistics.csv");
if ( !file.exists() )
file.createNewFile();
// Use FileWriter constructor that specifies open for appending
CsvWriter csvOutput = new CsvWriter(new FileWriter(file, true), ',');
//Create Header for CSV
csvOutput.write("Message Source");
csvOutput.write("Message Name");
csvOutput.write("Component");
csvOutput.write("Occurance");
csvOutput.write("Message Payload");
csvOutput.write("Bandwidth (Payload)");
csvOutput.write("Message Payload with Header");
csvOutput.write("Bandwidth (Payload with Header)");
csvOutput.endRecord();
for (Signal signal : messages) {
csvOutput.write(signal.getSource());
csvOutput.write(signal.getName());
csvOutput.write(signal.getComponent());
csvOutput.write(Integer.toString(signal.getOccurance()));
csvOutput.write(Integer.toString(signal.getSize()));
csvOutput.write(Float.toString(signal.getBandwidth()));
csvOutput.write(Integer.toString(signal.getSizewithHeader()));
csvOutput.write(Float.toString(signal.getBandwidthWithHeader()));
csvOutput.endRecord();
}
csvOutput.flush();
csvOutput.close();
Il formate correctement les données, mais le problème, c’est que lorsque je lance le code pour la deuxième fois, un deuxième fichier est créé et que le nouveau fichier contient des lignes dupliquées.
Est-ce que je ne nettoie pas certaines ressources?
Merci
Lorsque vous écrivez un fichier csv, vous devez inclure vos données de la manière suivante:
csvOutput.write("\"");
csvOutput.write(signal.getSource());
csvOutput.write("\"");
csvOutput.write(",\"")
csvOutput.write("\"");
csvOutput.write(signal.getName()
csvOutput.write("\"");
Et vous devez le faire, car s'il y a une virgule dans une donnée, cela poserait un problème lors de l'analyse et entraînerait le stockage des données dans des colonnes différentes. Assurez-vous également à l'intérieur du bloc
finally {
//csvOutput is closed here
}
Si vous voulez avoir une colonne séparée dans Excel, les champs que vous avez écrits dans votre code doivent être remplacés par fw.append(",");
Donnez simplement fw.append(";");
Il fonctionnera pour définir l'en-tête, au lieu de créer une variable comme String f="Id, Name, Salary"
et passer cette variable à la méthode fw.append(f);
Passez simplement les champs au lieu de créer la variablelike fw.append("Id; Name; Salary")
en utilisant un point-virgule.