在java中写入csv文件

时间:2014-03-03 11:45:04

标签: java csv performance readability

我正在编写一个java程序来将数据写入csv文件,该文件从数据库中获取密钥的计数值,并将与每个密钥对应的计数写入文件中。我使用FileWriter完成了它的伪代码如下所示

while (keys.hasNext()) {
    writer.append(keys.next().getCount());
    writer.append(',');
}

// where keys is the list of the keys

标题也以上述方式附加。 现在我遇到了OpenCSV和CommonsCSV等开源库,用于写入csv文件。

所以现在我想知道使用库是否更好或使用上述写入CSV文件的方式。有人可以告诉我哪种方式在可读性和效率方面更好?

4 个答案:

答案 0 :(得分:2)

有一个工程原则 - "如果有效 - 请勿触摸它"

当然,使用成熟的开源库通常可以在代码稳定性和灵活性方面获益。但是你会花时间学习这个库,这可能会导致你的代码中的一些重构很好地适应它。

在您的情况下,您可以实现对字段分隔符和编码的更大控制。

答案 1 :(得分:2)

这完全取决于你。这是您的代码的OpenCSV等价物:

 CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
 ...
 String[] row = new String[];
 int i=0;
 while(keys.hasNext()) {
     row[i++] = keys.next().getCount();
 }
 writer.writeNext(entries);

这比你的可读性更强还是更低?这是主观的,取决于你。我可以告诉你,你的效率不高。

值得注意的是,您的代码将在每行的末尾写入“,”。图书馆不会。您的代码可以像这样更改:

boolean more = keys.hasNext();
while (more) {
   writer.append(keys.next().getCount());
   more = keys.hasNext();
   if(more) {
      writer.append(',');
   }
}

CSV似乎很简单,通常是,直到您开始遇到更复杂的情况,例如包含逗号或转义引号的引用字段:

 A field,"another field","a field, containing a comma","A \"field\""

如果您的程序遇到这样的情况,它将会中断,您需要增强CSV算法来处理它。如果您使用的是库,那么您可以合理地期望它从一开始就处理引号和引用的逗号。这取决于你认为这种情况的可能性。

编写CSV代码通常很简单,但存在缺陷,并且维护较少的代码总是好的。

使用库有自己的开销 - 管理依赖项等等。

你可能不需要一个库来处理你现在正在做的简单的事情。如果您自己的代码发展变得更复杂,或者您开始​​需要将bean导出为CSV或处理包含带引号的逗号的CSV等功能,您可以考虑使用一个。

答案 2 :(得分:1)

使用开源库几乎没有考虑因素:

<强>优点:

  • 毫无疑问,开源图书馆必须经过社区的审查,因此可以作为最有效的选项之一
  • 保存了大量的样板代码并为您提供了一个良好的开端。
  • 图书馆包含更多功能,超出了您的需求。这有助于将来扩展应用程序。
  • 通常,开源库针对性能进行了优化。这样可以节省您的工作量。

<强>缺点:

  • 在您的应用程序中添加了另一个依赖项
  • 使用该库时涉及的小学习曲线。我个人会对此进行折扣,因为会有现成的代码供图书馆使用。
  • 如果用例非常简单,则稍微矫枉过正

答案 3 :(得分:0)

CSV 文件格式不仅仅是用逗号分隔列名或值。如果您的数据中有逗号(,)或双引号(“),则需要转义

例如,如果您有两列名称和地址。你需要写的名字是:aarish和address:“MyHome”,Chicago,MI

然后,如果你用CSV写这个:

name,address
aarish,"MyHome",Chicago, MI

这些值将被解析为四个不同的字段。

如果您使用这些库,它会以CSV格式输出

"name","address"
"aarish","""MyHome"",Chicago, MI"

此文件将是其他解析器或在其他编辑器中正确打开。

因此,如果您的数据中包含逗号(,)或双引号(“)等字符,我建议您使用库,如果您没有任何此类字符,则可以采用更简单的方法。< / p>