web-dev-qa-db-fra.com

écrire un fichier csv avec Buffered writer en Java

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 

8
Wearybands

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

}
1
shashwatZing

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.

0
Gitansh