首页 > 解决方案 > 不要在 csv 导入时在空间上拆分字符串

问题描述

摘要:只要我的 CSV 中有空格,我的代码就不会按预期工作。

嗨,我有点卡在一个自创的问题上。(我只是想学习,但用例是将 Excel 表格式化为我可以在另一个应用程序中导入的格式)

我有一个CSV如下:

EMPTY ;Column1;Column2;Column3;Column4
Line1 ;      x;      x;       ;x
Line2 ;      x;       ;      x;

(试图清理它以便更好地阅读)

结果是我的代码是一个包含以下内容的新文件:

Line1,Column1
Line1,Column2
Line1,Column4
Line2,Column1
Line2,Column3

这正是我想要的。

但是一旦我在导入文件中有空格,我就无法得到我需要的输出。

例如:此 csv 中的 Cloumn 1 而不是 Column1。

        File i_file = new File("import.csv");
        File e_file = new File("export.csv");

        Scanner inputStream;

        FileWriter fstream = new FileWriter(e_file, true);
        BufferedWriter out = new BufferedWriter(fstream);

        List<List<String>> lines = new ArrayList<>();

        try{
            inputStream = new Scanner(i_file);

                while(inputStream.hasNext()){
                    String line= inputStream.next();
                    String[] values = line.split(";");
                    lines.add(Arrays.asList(values));
                }

            inputStream.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }


        int lineNo = 0;

        for(List<String> line: lines) 
        {
            int columnNo = 0;
            for (String value: line) 
            {
                // System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);

                if (value.contentEquals("x")) 
                {
                    System.out.println((lines.get(lineNo)).get(0)+" is connected to "+(lines.get(0)).get(columnNo));
                    out.write((lines.get(lineNo)).get(0)+","+(lines.get(0)).get(columnNo));
                    out.newLine();
                }
                columnNo++;
            }
            lineNo++;

        }
        out.close();

希望这看起来不难看。

我在这里发现了一个类似的问题,他们提到要使用:

    inputStream = new Scanner(i_file);
    inputStream.useDelimiter(";");
    while (inputStream.hasNext())
    {   
        content = inputStream.next();
        System.out.println(content);    
    }

有了这个,我无法将值添加到 2d 列表中。因为我还没有弄清楚如何区分不同的线条。我还讨论了一个使用数组而不是列表的解决方案,但我认为我应该使用列表,因为我现在不知道 csv 会有多大。

有什么简单的方法可以与 Column1 之类的空间或 "Column1" 之类的空间一起使用吗?如果没有,我应该研究什么来解决这个问题?

标签: javacsvjava.util.scanner

解决方案


谢谢皮科洛,

第一次尝试你的答案看起来很棒。

try {
        inputStream = new Scanner(i_file);
        inputStream.useDelimiter(Pattern.compile("[\\r\\n]+"));
        while (inputStream.hasNext())
        {   
            String line= inputStream.next();
            String[] values = line.split(";");
            lines.add(Arrays.asList(values));   
            // System.out.println(line);
        }
        System.out.println(lines);
        }

如果我使用发布的代码,我会得到输出:

[[EMPTY, Column 1, Column2, Column3, Column4], [Line1, x, x, , x], [Line2, x, , x]]

看起来完全像我正在寻找的 2 维列表。


推荐阅读