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