[英]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.