2

一整天我一直在寻找如何解决这个问题,什么都没有……我想编写函数,将 CSV 文件转换为列表(字符串)集合。这是这个函数:

public Collection<? extends List<String>> parse() throws IOException {
    Collection<List<String>> collectionOfLists = new ArrayList<List<String>>();
    CsvListReader parser = new CsvListReader(Files.newBufferedReader(pathToFile, StandardCharsets.UTF_8), CsvPreference.EXCEL_PREFERENCE);

    List<String> row;
    while( (row = parser.read()) != null)
        collectionOfLists.add(row);

    return collectionOfLists;
}

public static String toString(Collection<? extends List<String>> csv) {
    StringBuilder builder = new StringBuilder();
    for(List<String> l : csv) {
        for(String s : l)
            builder.append(s).append(',');
        if(builder.length() > 0)
            builder.setCharAt(builder.length()-1,'\n');
    }
    return builder.toString();
}

但例如对于该输入:

id, name, city, age
1,"Bob",London,12

toString(parse()) 的输出是:

id, name, city, age
1,Bob,London,12 

而不是相同的输入:/ 我能做什么,字符串包含 \" (引号)?请帮助我。

4

3 回答 3

2

从你的问题中不清楚你是否在问......

1. 我的数据包含引号 - 为什么要去掉它们?

在这种情况下,我会向您指出CSV 规范,因为您的 CSV 文件没有正确转义,因此这些引号实际上并不是您数据的一部分。

它应该是

1,""Bob"",London,12

不是

1,"Bob",London,12

2. 写作时如何应用引号(即使数据不包含逗号、引号等)?

默认情况下,Super CSV 仅在必要时转义(该字段包含逗号、双引号或换行符)。

如果您真的想启用引号,那么您可以使用引号模式配置 Super CSV 。

例如,您始终可以使用以下首选项引用示例中的 name 列:

private static final CsvPreference ALWAYS_QUOTE_NAME_COL = 
    new CsvPreference.Builder(CsvPreference.STANDARD_PREFERENCE)
    .useQuoteMode(new ColumnQuoteMode(2)).build();

或者,如果您想引用所有内容,那么您可以使用AlwaysQuoteMode,或者如果您想要一个完全自定义的解决方案,那么您可以编写自己的QuoteMode.

于 2014-04-11T06:10:16.370 回答
1

您创建自己的偏好。

CsvPreference excelPreference = new CsvPreference.Builder('\'', ',', "\n").build();
CsvListReader parser = new CsvListReader(Files.newBufferedReader(pathToFile , StandardCharsets.UTF_8), excelPreference);

之后,它将按预期输出。在这个例子中,如果你的 csv 文件中有单引号,你将去掉它,并保持双引号不变。

于 2014-04-11T00:07:12.673 回答
1

CsvPreference.EXCEL_PREFERENCE您给出的内容中,引号字符是javadoc"中描述的。引号字符是用于包装希望按字面显示的特殊字符的字符。

因此,对于这些偏好,生成 CSV 内容的适当方式是

id, name, city, age
1,"""Bob""",London,12

否则,CSV 解析器只会认为

"Bob"

字面上的意思是

Bob

因为引号之间没有其他特殊字符。但是引号是一个特殊字符,因此如果它出现在引号之间,则从字面上看,它将被视为引号。

或者,提供CsvPreference具有不同引号字符的不同对象。

只有在您确定您的 CSV 制作人发送给您的内容后,才能做出此决定。

于 2014-04-10T23:51:45.523 回答