CSVFormat 将引号添加到 header
CSVFormat add quotation to header
我正在使用 apache.commons.csv 创建 CSV 文件。生成文件时,我想用 .withHeader()
方法解析 header。我解析的值应该有像“FILENAME”这样的引号。为此,我想使用枚举 class。但是我不太确定在名称周围添加引号是如何工作的。我用那个代码测试了它:
private enum Header{
FILENAME("\"FILENAME\""),
TEST("\"Test\"");
private final String string;
Header(String string){
this.string = string;
}
}
public void addHeader(File outFile) throws IOException{
CSVPrinter printer = new CSVPrinter(outFile, CSVFormat.DEFAULT.withHeader(Header.class));
}
然而,当创建 outfile
时,它只包含不带引号的 header。有谁知道如何解决它?我知道我使用字符串数组作为 header 但我想避免这种情况,因为我有很多值,字符串会变得很长。
因为withHeader(Header.class)
的实现方式,它使用Enums的.name()
方法将枚举值作为字符串获取,它获取实际的枚举值作为字符串:FILENAME
不是 "\"FILENAME\""
。
要在 csv 中获取双引号,您可以使用这样的字符串数组:
CSVPrinter printer = new CSVPrinter(new FileWriter(outFile), CSVFormat.DEFAULT.withHeader("\"FILENAME\"", "\"TEST\""));
正如 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 想要的是 header 被引用而不是 header 包含双引号。我们可以使用 withQuoteMode(QuoteMode.ALL)
并在 getCsvHeader
.
中删除 \"
CSVFormat.DEFAULT.withQuoteMode(QuoteMode.ALL).withHeader(Arrays.stream(Header.values()).map(Header::getCsvHeader).toArray(String[]::new)))
结果会是
"FILENAME","Test"
请注意,这也会引用 csv 中的记录。如果我们只想引用header,请参考CSVPrinter remove quotes only from header,这是相反的方式,但技巧仍然适用。
我正在使用 apache.commons.csv 创建 CSV 文件。生成文件时,我想用 .withHeader()
方法解析 header。我解析的值应该有像“FILENAME”这样的引号。为此,我想使用枚举 class。但是我不太确定在名称周围添加引号是如何工作的。我用那个代码测试了它:
private enum Header{
FILENAME("\"FILENAME\""),
TEST("\"Test\"");
private final String string;
Header(String string){
this.string = string;
}
}
public void addHeader(File outFile) throws IOException{
CSVPrinter printer = new CSVPrinter(outFile, CSVFormat.DEFAULT.withHeader(Header.class));
}
然而,当创建 outfile
时,它只包含不带引号的 header。有谁知道如何解决它?我知道我使用字符串数组作为 header 但我想避免这种情况,因为我有很多值,字符串会变得很长。
因为withHeader(Header.class)
的实现方式,它使用Enums的.name()
方法将枚举值作为字符串获取,它获取实际的枚举值作为字符串:FILENAME
不是 "\"FILENAME\""
。
要在 csv 中获取双引号,您可以使用这样的字符串数组:
CSVPrinter printer = new CSVPrinter(new FileWriter(outFile), CSVFormat.DEFAULT.withHeader("\"FILENAME\"", "\"TEST\""));
正如 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 想要的是 header 被引用而不是 header 包含双引号。我们可以使用 withQuoteMode(QuoteMode.ALL)
并在 getCsvHeader
.
\"
CSVFormat.DEFAULT.withQuoteMode(QuoteMode.ALL).withHeader(Arrays.stream(Header.values()).map(Header::getCsvHeader).toArray(String[]::new)))
结果会是
"FILENAME","Test"
请注意,这也会引用 csv 中的记录。如果我们只想引用header,请参考CSVPrinter remove quotes only from header,这是相反的方式,但技巧仍然适用。