使用Apache Commons CSV进行CSV输出
首先
输出CSV并不是非常困难的事情,但是需要注意一些规范。如果不小心忽略规范进行输出,可能会导致输出的结果不符合规范。实际上,我曾经接近完成类似的任务。
要了解规范本身,可以在维基百科或官方规范中进行确认。而对于在Java中读写CSV,Apache提供了相应的库,可以使用此库进行输出的总结。不过本次只讨论输出,不涉及读取的部分。
公式手册的一个翻译选项可以是:官方指南。
基本的
文档注释
关于初始设置
如果使用Maven或Gradle,只需参考上述链接获取groupId等信息即可。
由于官方可能也提供了下载链接,所以您也可以从官方网站下载并运行(未经确认)。
基本使用方法
Javadoc文件中针对CSVPrinter的部分提供了一个简单的示例。
try (CSVPrinter printer = new CSVPrinter(new FileWriter("csv.txt"), CSVFormat.EXCEL)) {
printer.printRecord("id", "userName", "firstName", "lastName", "birthday");
printer.printRecord(1, "john73", "John", "Doe", LocalDate.of(1973, 9, 15));
printer.println();
printer.printRecord(2, "mary", "Mary", "Meyer", LocalDate.of(1985, 3, 29));
} catch (IOException ex) {
ex.printStackTrace();
}
id,userName,firstName,lastName,birthday
1,john73,John,Doe,1973-09-15
2,mary,Mary,Meyer,1985-03-29
以下是解释。
以下解释如下。
以下为说明。
CSVPrinter printer = new CSVPrinter(new FileWriter("csv.txt"), CSVFormat.EXCEL)
CSVPrinter是用于CSV输出的实例。 CSVFormat.EXCEL是CSV输出时的格式。 基本上,您可以使用基于RFC4180的DEFAULT(略有差异)或与EXCEL文件规范相符的EXCEL,不过由于还有其他选项,所以最好查看官方的Javadoc。
通过查看Javadoc可以了解它们之间的差异,但也有一些设置仅涉及CSV的读取。
printer.printRecord("id", "userName", "firstName", "lastName", "birthday");
printer.printRecord(1, "john73", "John", "Doe", LocalDate.of(1973, 9, 15));
printer.println();
printer.printRecord(2, "mary", "Mary", "Meyer", LocalDate.of(1985, 3, 29));
使用printRecord函数将输出一行数据。由于参数是Object类型,所以可以接收除字符串以外的其他数据类型。使用println函数进行换行。
如果值中包含分隔符,则按照指定的格式输出(如果使用CSVFormat.EXCEL,则值将以双引号括起来输出)。
printer.printRecord("te,st", "テスト");
"te,st",テスト
关于其他用法
发挥潜力
通过使用print方法,可以将每个值而不是每个记录单独输出。如果连续执行,它会自动插入分隔符,但是即使在同一行中同时使用printRecord方法,也不会插入分隔符。
printer.print("test1");
printer.print("test2");
printer.printRecord("test3", "test4");
test1,test2test3,test4
除此之外,还有一些其他方法可以输出评论,比如printComment方法,以及能够输出多行而不仅限于一条记录的printRecords方法(printRecords方法甚至可以接受ResultSet作为参数)。因此,根据需要选择合适的方法使用会更好。
CSV格式
使用CSVFormat可以根据需要事先对CSV格式进行修改。在下面的示例中,我们事先添加了标题行并将分隔符更改为制表符。
CSVPrinter printer =
CSVFormat.DEFAULT.withHeader("ヘッダー1", "ヘッダー2", "ヘッダー3").withDelimiter('\t').print(writer);
printer.printRecord("a", "b", "c");
ヘッダー1 ヘッダー2 ヘッダー3
a b c
通过withHeader方法添加标题行,并通过withDelimiter方法更改分隔符。最后的print方法是为了获得CSVPrinter的实例。
除此之外,还有很多操作可以使用这些方法来调整创建的CSV格式,但我们不希望创建一个不易理解的CSV,以免被其他应用程序误认为是无法读取的CSV。
最后
我想要使用标准功能处理CSV。