首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在java中解析一种形式的csv文件

如何在java中解析一种形式的csv文件
EN

Stack Overflow用户
提问于 2018-10-21 02:52:49
回答 2查看 58关注 0票数 -3

我正在尝试通过使用带有分隔符的scanner来解析一个相当特殊格式的文件,但我对regex还是个新手。格式:

“玛丽”,“帕特里夏”,“琳达”,“芭芭拉”,“伊丽莎白”,“詹妮弗”,...

目前,我使用的分隔符和代码如下:

static void readNames(String[] names) {

    try {
        Scanner sc = new Scanner(new File("names.txt")).useDelimiter(",");
        int count = 0;

        while(sc.hasNext()) {

            names[count] = sc.next();
            count ++;


        }
    } catch (FileNotFoundException e) {

        e.printStackTrace();
    }

} 

然而,这给了我引号,这不是我想要的。

然后,我尝试使用以下分隔符:

String delimiter = " "," ";

我很快意识到,由于大量的引号,它不能被识别为字符串。

这是在我得到答案后编辑的,但是有没有办法像我在第二个分隔符中想要的那样,使用",“作为分隔符?

EN

回答 2

Stack Overflow用户

发布于 2018-10-21 03:03:04

根据你帖子中给出的数据,我认为你可以使用这个模式","|“

下面是你可以写的代码,

public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(new FileInputStream("filename.txt"));
    sc.useDelimiter(Pattern.compile("\",\"|\""));

    while(sc.hasNext()) {
        System.out.println(sc.next());
    }
    sc.close();
}
票数 1
EN

Stack Overflow用户

发布于 2018-10-25 13:11:35

如果你只是想要一个java编写的有用的csv解析器。我最近写了一篇很好的文章:

public static Iterable<String[]> parseCSV(final InputStream stream) throws IOException {
    return new Iterable<String[]>() {
        @Override
        public Iterator<String[]> iterator() {
            return new Iterator<String[]>() {
                static final int UNCALCULATED = 0;
                static final int READY = 1;
                static final int FINISHED = 2;
                int state = UNCALCULATED;
                ArrayList<String> value_list = new ArrayList<>();
                StringBuilder sb = new StringBuilder();
                String[] return_value;

                public void end() {
                    end_part();
                    return_value = new String[value_list.size()];
                    value_list.toArray(return_value);
                    value_list.clear();
                }

                public void end_part() {
                    value_list.add(sb.toString());
                    sb.setLength(0);
                }

                public void append(int ch) {
                    sb.append((char) ch);
                }

                public void calculate() throws IOException {
                    boolean inquote = false;
                    while (true) {
                        int ch = stream.read();
                        switch (ch) {
                            default: //regular character.
                                append(ch);
                                break;
                            case -1: //read has reached the end.
                                if ((sb.length() == 0) && (value_list.isEmpty())) {
                                    state = FINISHED;
                                } else {
                                    end();
                                    state = READY;
                                }
                                return;
                            case '\r':
                            case '\n': //end of line.
                                if (inquote) {
                                    append(ch);
                                } else {
                                    end();
                                    state = READY;
                                    return;
                                }
                                break;
                            case ',': //comma
                                if (inquote) {
                                    append(ch);
                                } else {
                                    end_part();
                                    break;
                                }
                                break;
                            case '"': //quote.
                                inquote = !inquote;
                                break;
                        }
                    }
                }

                @Override
                public boolean hasNext() {
                    if (state == UNCALCULATED) {
                        try {
                            calculate();
                        } catch (IOException ex) {
                        }
                    }
                    return state == READY;
                }

                @Override
                public String[] next() {
                    if (state == UNCALCULATED) {
                        try {
                            calculate();
                        } catch (IOException ex) {
                        }
                    }
                    state = UNCALCULATED;
                    return return_value;
                }
            };
        }
    };
}

您通常会非常有帮助地处理此过程,如下所示:

for (String[] csv : parseCSV(stream)) {
    //<deal with parsed csv data>
}

通常,它将csv流解析器包装在一个迭代器中,因此您可以使用特殊的java for循环。所以你给它一个流,它会给你一个字符串数组的for循环,这通常是你想要的数据的最好方式。

如果你想要理解,你需要用额外的信息更好地表达你的问题,清楚地表明你认为你需要什么以及为什么,因为你的帖子中的大多数都没有多大意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52909041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档