【问题标题】:writing a csv file using Buffered writer in Java在 Java 中使用缓冲写入器编写 csv 文件
【发布时间】:2013-09-26 11:50:29
【问题描述】:

我正在使用 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 java 库而不是使用缓冲写入器。 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 行类似的数据。

是我没有清理一些资源吗?

谢谢

【问题讨论】:

  • 列应该用逗号分隔
  • @tim 你的意思是每次写完我都应该做 writer.write(",");
  • 您可以这样做 - 列名和数据中似乎缺少它们。为了使文档格式正确,每一列都应该用逗号分隔。对于 .csv 无论如何
  • 嗯,蒂姆已经回答了你问题的第一部分。现在对于第二部分(重复的行),我敢打赌,在运行之间您不会清理消息变量。我还建议重新考虑异常管理,您应该始终在 finally 块中关闭资源,这样,如果发生异常,您就不会留下任何东西。但是,根据您提供的信息,这似乎不是问题。
  • 你不是忘了clear()messages吗?也许您只是在向其中添加项目,这就是它被复制的原因。

标签: java csv bufferedwriter


【解决方案1】:

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

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

您需要这样做,因为如果数据中有逗号,则会在解析时出现问题,并导致数据存放在不同的列中。还要确保在 finally 块内

finally {
//csvOutput is closed here

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      据我了解,您的实际数据与列不对齐,因为它无法知道列的宽度。

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

      【讨论】:

      • 是的,比如writer.write("\t");(制表符)
      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 2015-06-11
      • 2019-08-13
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多