在java中写入csv文件

在java中写入csv文件,java,csv,performance,readability,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和Commo

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

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

// where keys is the list of the keys
标题也以上述方式追加。 现在我遇到了OpenCSV和CommonCSV等用于写入csv文件的开源库


所以现在我想知道是使用这些库更好,还是使用上面提到的写入CSV文件的方法更好。有人能告诉我哪种方法在可读性和效率方面更好吗?

有一个工程原理-“如果它有效,不要碰它”

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


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

有一个工程原理-“如果可行,不要碰它”

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


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

这完全取决于您。以下是与您的代码相当的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代码通常很简单,但也存在一些缺陷,因此需要维护的代码越少越好

使用库有其自身的开销——管理依赖项等等


你可能不需要一个图书馆来存放你现在正在做的简单的东西。如果你自己的代码进化得更复杂,或者如果你开始需要像Cbean输出bean,或者处理包含引用逗号的CSV,那么你可以考虑使用一个。以下是与您的代码相当的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那样输出bean,或者处理包含引用逗号的CSV,那么您可以考虑使用其中一个。<>“强> CSV <强>文件格式不是简单地用逗号分隔您的列名或值。如果数据中有逗号(,)或双引号(“),则需要正确转义

例如,如果您有两列name和address,则需要写入的值是name:aarish和address:MyHome,位于密歇根州芝加哥

如果你用CSV写的话,比如:

name,address
aarish,"MyHome",Chicago, MI
这些值将被解析为四个不同的字段

如果您使用这些库,它将像CSV一样为您提供输出

"name","address"
"aarish","""MyHome"",Chicago, MI"
此文件将由其他解析器正确读取或在其他编辑器中正确打开


因此,如果您的数据中有逗号(,)或双引号(“)等字符,我建议您使用库,如果您没有这些字符,可以使用更简单的方法。

CSV文件格式并不是简单地用逗号分隔列名或值。如果数据中有逗号(,)或双引号(“),则需要正确转义

例如,如果您有两列name和address,则需要写入的值是name:aarish和address:MyHome,位于密歇根州芝加哥

如果你用CSV写的话,比如:

name,address
aarish,"MyHome",Chicago, MI
这些值将被解析为四个不同的字段

如果您使用这些库,它将像CSV一样为您提供输出

"name","address"
"aarish","""MyHome"",Chicago, MI"
此文件将由其他解析器正确读取或在其他编辑器中正确打开


因此,如果您的数据中有逗号(,)或双引号(“)等字符,我建议您使用库,如果您没有这些字符,可以使用更简单的方法。

使用开放源代码库需要考虑以下几点:

优点:

  • 毫无疑问,开源库必须经过社区的审查,因此它是最有效的选择之一
  • 节省了大量样板代码