java - Android/Java,如何在某些字段中处理带有换行符和逗号的csv文件?

标签 java android

Android/Java,如何处理csv文件的某些字段有换行和逗号?

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

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

我应该怎么做才能正确解析它并将其存储到对象数组列表中?

如果我阅读第一行,我将错过最后几个字段的第二部分。

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

最佳答案

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

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.

关于java - Android/Java,如何在某些字段中处理带有换行符和逗号的csv文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503474/

相关文章:

java - Android Oreo 上小部件的屏幕开/关广播监听器

java - 进行年龄验证的最佳方法是什么?

android - 为什么 picasso 评论 "Do NOT pass BuildConfig.DEBUG"

java - 从 Service 向 Activity 发送一条简单的消息

android - 在 cocos2d-x 中监听 Android 后退按钮

java - 使用不同计算机上的模拟器将客户端连接到服务器

java - 使用其他类(class)的 NFC Activity

java - JAX-RS/Jersey 响应 406 没有实体,但 RFC 2616 推荐一个

android - 显示的启动画面 Logo 质量差

Android 模拟器永远不会禁用相机