正如 George Nechifor 所建议的,我们可以使用CSVFormat#withHeader(String...)
以获得更好的灵活性。为了避免重复和硬编码,我们当然应该使用来自枚举的值,并进行简单的映射。
Arrays.stream(Header.values()).map(Header::getCsvHeader).toArray(String[]::new)
并将导致
"""FILENAME""","""Test"""
一个可运行的示例如下(使用 apache commons-csv 1.8):
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
public class CsvWithEnumHeader {
public static void main(String[] args) throws IOException {
addHeader(new File("C://temp/demo.csv"));
}
public static void addHeader(File outFile) throws IOException {
// apache common csv 1.8 cannot compile with new CSVPrinter(outFile,...)
try (CSVPrinter printer = new CSVPrinter(new FileWriter(outFile),
CSVFormat.DEFAULT.withHeader(Arrays.stream(Header.values()).map(Header::getCsvHeader).toArray(String[]::new)))) {
}
}
}
public enum Header {
FILENAME("\"FILENAME\""),
TEST("\"Test\"");
private final String csvHeader;
Header(String csvHeader) {
this.csvHeader = csvHeader;
}
public String getCsvHeader() {
return csvHeader;
}
}
从评论更新
似乎OP想要的是标题被引用而不是包含双引号的标题。我们可能withQuoteMode(QuoteMode.ALL)
会\"
在getCsvHeader
.
CSVFormat.DEFAULT.withQuoteMode(QuoteMode.ALL).withHeader(Arrays.stream(Header.values()).map(Header::getCsvHeader).toArray(String[]::new)))
结果将是
"FILENAME","Test"
请注意,这也会引用 csv 中的记录。如果我们只想引用标头,请参考CSVPrinter remove quotes only from header,这是以相反的方式进行的,但技巧仍然适用。