Android / Java,如何在某些字段中使用换行和逗号来处理csv文件?

时间:2019-12-27 16:29:25

标签: java android

Android / Java,如何在某些字段中使用换行和逗号来处理csv文件?

例如,每个记录有三个字段。

A, B, "Good morning,
may I get a cup of water?"
C, D, good night.

我应该怎么做才能正确解析它并将其存储到对象arraylist?

如果我读第一行,我将错过最后一栏的第二部分。

(我试图将opencsv添加到android项目中,但是在构建时出现了错误,与dex ..难以理解..so相关,所以我尝试自己实现load csv函数,因为我只需要阅读仅文件,但我想不出正确的逻辑。)

1 个答案:

答案 0 :(得分:0)

要读取文件并保存每条记录,可以使用:

List<String> content = Files.lines(Paths.get("app.csv")).collect(Collectors.toList());

或者,如果您要保存每个以逗号分隔的字段,请使用以下命令:

List<String> content = Files.lines(Paths.get("app.csv")).collect(Collectors.toList());
List<String> result = new ArrayList();

content.forEach((t) -> {
    for(String s : t.split(",")){
        result.add(s);
    }
});

System.out.println(result);

结果:

[A,  B,  "Good morning, may I get a cup of water?", C,  D,  good night.]

编辑

    List<String> content = Files.lines(Paths.get("app.csv")).collect(Collectors.toList());
    List<String> result = new ArrayList();

    StringJoiner tmp = new StringJoiner(" ");
    boolean insideTextFlag = false;

    for(String t : content){
        for (String s : t.split(",")) {
            if(s.contains("\"") || insideTextFlag){

                if(s.contains("\"") && insideTextFlag)
                    insideTextFlag = false;
                else
                    insideTextFlag = true;

                tmp.add(s.trim());                    

                if(!insideTextFlag){
                    result.add(tmp.toString());
                    tmp = new StringJoiner(" ");
                }
            }else{
                result.add(s.trim());
            }
        }
    }

    result.forEach((t) -> {
        System.out.println(t);
    }); 

输出

A
B
"Good morning may I get a cup of water?"
C
D
good night.