java - JAVA 中的 CSV 解析器,字符串中的双引号(SuperCSV、OpenCSV)

标签 java parsing csv quotes supercsv

我一整天都在寻找如何解决这个问题,但一无所获...... 我想编写函数,将 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 

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

最佳答案

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

<强>1。我的数据包含引号 - 为什么它们被删除?

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

应该是

1,""Bob"",London,12

不是

1,"Bob",London,12

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

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

如果您确实想要启用报价,那么您可以使用 quote mode 配置 Super CSV .

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

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

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

关于java - JAVA 中的 CSV 解析器,字符串中的双引号(SuperCSV、OpenCSV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23000676/

相关文章:

ios - 在 iOS 上将数据导出到 XLS(不是通过 CSV)

python - 使用 Excel 电子表格表示树层次结构以便 Python CSV 阅读器轻松解析?

java - 我可以在不硬编码大小的情况下将 ArrayList 中的 Java 值分配给不同的变量吗?

java - 自动优化对象变量的 L 缓存?

parsing - 两个 Haskell 程序如何通过 stdin 和 stdout 交换整数值而不将数据视为文本?

javascript - 什么是代码解析?

java - 通知(警报)在 selenium webdriver 的整个应用程序中随机出现

java - 仅显示选定的 Log4j 调试语句

java - 是否有日志解析器 Java 库?

python - 无法解析使用 Flask 上传的 .csv 文件