使用Java中的Buffered writer编写csv文件

时间:2013-09-26 11:50:29

标签: java csv bufferedwriter

我正在使用java中的缓冲编写器编写csv文件。我的数据写得正确,但我希望有不同的数据来源列,目前它正在将每个日期实例写入一行但不按列分隔。

代码是

  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();

有没有办法将数据列分开,以便正确读取?

修改

我使用CSVReader库来代替使用缓冲编写器。 http://www.csvreader.com/java_csv.php 代码现在是

  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();

它正确格式化数据,但问题是现在当我第二次运行代码创建第二个文件并且新文件包含重复行时,对于第一个文件中的每一行,第二个文件中有2行类似的数据。

我是不是在清理一些资源?

谢谢

3 个答案:

答案 0 :(得分:1)

编写csv文件时,您需要像这样包含数据

csvOutput.write("\"");
csvOutput.write(signal.getSource());
csvOutput.write("\"");
csvOutput.write(",\"")
csvOutput.write("\"");
csvOutput.write(signal.getName()
csvOutput.write("\"");

你需要这样做,因为如果数据中有逗号,它会在解析时导致问题,并导致数据存放在不同的列中。还要确保内部最终阻止

finally {
//csvOutput is closed here

}

答案 1 :(得分:0)

如果你想在Excel中有一个单独的coloumn,对于你在代码中写的字段而不是fw.append(","); 只需给fw.append(";"); 它将起作用并设置Header,而不是创建像String f="Id, Name, Salary"这样的变量并将该变量传递给方法fw.append(f); 只需传递字段而不是创建变量 像fw.append("Id; Name; Salary")使用分号。

答案 2 :(得分:-1)

根据我的理解,您的实际数据没有排列列,因为它无法知道列的宽度。

您可以尝试使用制表符,或预定义每列的宽度(例如将它们全部设为10个字符)。