解析csv文件时

时间:2018-08-26 00:18:54

标签: java spring

在一个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;

1 个答案:

答案 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是否有解决方法。

如果记录开始使用其他讨厌的字符(逗号,引号等),则可能需要更复杂的正则表达式。我不知道这些记录的来源是什么,但是在拆分文件之前可能需要进行一些清理。