在一个csv文件中,我有一条记录呈现如下:
,"SKYY SPA MARTINI
2 oz. SKYY Vodka
Fresh cucumber
Fresh mint
Splash of simple syrup
Muddle cucumber & mint with syrup.
Add SKYY Vodka and shake with ice.
Strain into a chilled martini glass.
Garnish with a fresh mint sprig and cucumber slice.",
每行以LF回车结尾。
我认为这将被视为字符串,而回车符将不会被视为换行符,但是事实并非如此,这正在破坏我的脚本。有没有办法让读者仅在不加引号的情况下解析换行符?我目前正在使用它作为我的代码,找不到用于标记程序的设置,使我无法执行此操作。
// instantiate description line mapper
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
DefaultLineMapper<LCBOProduct> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
// set description line mapper
reader.setLineMapper(lineMapper);
return reader;
答案 0 :(得分:0)
受此CSV regex post的启发,我编写了一种用于执行此操作的快捷方法:
public static void main(String[] args) {
String line = "\"BEEP\",\"BOOP\",\"TWO SHOTS\rOF VODKA\"\r\"BOOP\",\"BEEP\",\"LEMON\rWEDGES\"";
String quote = "\"";
String splitter = "\r";
String delimiter = ",";
parse(line, delimiter, quote, splitter);
}
public static void parse(String data, String delimiter, String quote, String splitter) {
String regex = splitter+"(?=(?:[^"+quote+"]*\"[^"+quote+"]*\")*[^"+quote+"]*$)";
String[] lines = data.split(regex, -1);
List<String[]> records = new ArrayList<String[]>();
for(String line : lines) {
records.add(line.split(delimiter, -1));
}
for(String[] line : records) {
for(String record : line) {
System.out.println("RECORD: " + record); //do whatever
}
}
}
当然,考虑到某些CSV文件的大小,您将需要与StringBuilder一起使用,并且可能将myStringBuilder.toString().split(regex, -1);
用于parse
方法。
这可能不是Spring的处理方式。但是正如吉姆·加里森(Jim Garrison)所说,这是一个边缘情况,我不确定Spring是否有解决方法。
如果记录开始使用其他讨厌的字符(逗号,引号等),则可能需要更复杂的正则表达式。我不知道这些记录的来源是什么,但是在拆分文件之前可能需要进行一些清理。