如何利用CSV解析 - JAVA

时间:2017-04-09 22:30:15

标签: java file loops java.util.scanner

我收到一个文件,内容如下:

"String",int,int
"String",int,int
"String",int,int
...

给定未知数量的变量, while(scanner.hasNextLine())可以解决条目数。我的目标是获取这三个数据并将它们存储到节点中。我正在使用方法 BinaryTree.addNode(String,int,int)。当我尝试读取数据时,我的问题就出现了。我试图删除文档中的逗号,然后尝试使用以下内容重新读取数据:

Scanner firstpass = new Scanner(file);
String input = firstpass.nextLine().replaceAll(",", "");
Scanner secondpass = new Scanner(input);
String variable1 = secondpass.next();
int variable2 = secondpass.nextInt();
int variable3 = secondpass.nextInt();

然而,这是一种非常无益的方式。

已更新 编译错误可以通过以下方式修复:

try {
            Scanner scanner1 = new Scanner(file);
            while (scanner1.hasNextLine()) {
                String inventory = scanner1.nextLine().replaceAll(",", " ");
                Scanner scanner2 = new Scanner(inventory);
                while (scanner2.hasNext()){
                    String i = scanner2.next();
                    System.out.print(i);
                }
                scanner2.close();
            }
            scanner1.close();
        } 
        catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }

给我输出: "字符串" intint"字符串" intint"字符串" intint ... 所以我知道我走在正确的轨道上。但是" String"中的任何(空格);变量被删除。所以他们会输出" SomeString"而不是"一些字符串"。此外,我仍然不知道如何删除""从字符串。

2 个答案:

答案 0 :(得分:0)

我不会使用

String input = firstpass.nextLine().replaceAll(",", "");
Scanner secondpass = new Scanner(input);
String variable1 = secondpass.next();
int variable2 = secondpass.nextInt();
int variable3 = secondpass.nextInt();

使用以下方法

String line = firstpass.nextLine();
String[] temp = line.split(","); 
String variable1 = temp[0];
int variable2 = Integer.parseInt(temp[1]);
int variable3 = Integer.parseInt(temp[2]);

答案 1 :(得分:0)

您显示的格式符合CSV (Comma-Separated Values)格式,因此您最好的选择是使用CSV解析器,例如Apache Commons CSV ™

如果您不想添加第三方库,可以使用Regular Expression来解析该行。

从文件中读取行应使用Scanner 而不是 。请改用BufferedReader。请参阅Scanner vs. BufferedReader

try (BufferedReader in = new BufferedReader(new FileReader(file))) {
    Pattern p = Pattern.compile("\"(.*?)\",(-?\\d+),(-?\\d+)");
    for (String line; (line = in.readLine()) != null; ) {
        Matcher m = p.matcher(line);
        if (! m.matches())
            throw new IOException("Invalid line: " + line);
        String value1 = m.group(1);
        int value2 = Integer.parseInt(m.group(2));
        int value3 = Integer.parseInt(m.group(3));
        // use values here
    }
} catch (IOException | NumberFormatException ex) {
    ex.printStackTrace();
}

请注意,如果字符串包含转义字符,则不起作用,例如如果它包含嵌入的双引号。为此,您应该使用解析器库。

上面的代码将正确处理嵌入空格和逗号。