我收到一个文件,内容如下:
"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"而不是"一些字符串"。此外,我仍然不知道如何删除""从字符串。
答案 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();
}
请注意,如果字符串包含转义字符,则不起作用,例如如果它包含嵌入的双引号。为此,您应该使用解析器库。
上面的代码将正确处理嵌入空格和逗号。