繁体   English   中英

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

[英]CSV parser in JAVA, double quotes in string (SuperCSV, OpenCSV)

我整天都在寻找如何解决这个问题的方法,但没有什么...我想编写函数,将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规范,因为您的CSV文件未正确转义,因此这些引号实际上并不是数据的一部分。

它应该是

1,""Bob"",London,12

1,"Bob",London,12

2.在编写时如何使用引号(即使数据不包含逗号,引号等)?

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

如果您确实要启用引号,则可以将超级CSV配置为引号模式

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

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

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

在给定的CsvPreference.EXCEL_PREFERENCE ,引号字符是javadoc中描述的" 。引号字符是用于包装希望从字面上出现的特殊字符的字符。

因此,对于这些首选项,生成CSV内容的适当方法是

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

否则,CSV解析器只会认为

"Bob"

字面上的意思是

Bob

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

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

仅在确定CSV生产者向您发送的内容之后,才能做出此决定。

您创建自己的首选项。

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

之后,它将按预期输出。 在此示例中,如果csv文件中有单引号,则将其去除,并保持双引号不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM