如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数
Posted
技术标签:
【中文标题】如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数【英文标题】:How to read Pipe delimited Line | from a File and Splitting Integers in two different ArrayList 【发布时间】:2016-01-30 05:20:19 【问题描述】:程序需要解释文件中的管道分隔行并将其存储在两个不同的 ArrayList 中。我已经尝试了 *** 上的几乎所有相关链接,并了解到 |是一个特殊的操作,因此它被保留。所以我找到了其他几种阅读这些行的方法,但它们都没有真正起作用。
这是我的场景:
文本文件如下所示:
0|0.20 1|0.10 2|0.20
等等……
第一个整数需要到ArrayList a1,第二个浮点数在管道分隔符后需要到ArrayList a2
我尝试使用扫描仪,他们使用 split 来拆分行。将它们保存为字符串,然后进行字符串转换。我使用了以下方法:
方法一:
public static void readingFunc(String dirPath) throws NumberFormatException, IOException
Path p = Paths.get(dirPath, "File.dat");
for (String line: Files.readAllLines(p,StandardCharsets.US_ASCII))
for (String part : line.split("\\|"))
Integer i = Integer.valueOf(part);
intArrayList1.add(i);
方法二:
try(BufferedReader in = new BufferedReader(new FileReader(dirPath+"/File.dat")))
String line;
while((line = in.readLine())!=null)
String[] pair = line.split("\\|",-1);
//a1.add(Integer.parseInt(pair[0]));
//a2.add(Integer.parseInt(pair[1]))
方法三:
try(BufferedReader in = new BufferedReader(new FileReader(dirPath+"/File.dat")))
String line;
while((line = in.readLine())!=null)
String[] pair = line.split("\\|",-1);
我还使用了其他几种方法,例如 Scanner,但无法获得结果。我有几个与上面类似的文件,我需要读取它们以将其保存在 ArrayList 中以供处理。
PS:其中一个文件包含三个数据,例如:
1|0.21|0.37 2|0.08|0.12
等等。我猜。这将很容易并且类似于两个分隔符过程。 PS:我在 Linux Eclipse IDE 上开发,所以路径是:
/home/user/workspace1/Java_Code
我将路径作为 dirPath 从主函数发送,然后在函数中调用它。请建议我如何使用它?
我已经检查了以下链接:
Java Null value causing issue when reading a pipe delimited file
Read a file and split lines in Java.
Java - Scanner : reading line of record separated by Pipe | as delimiter
Java - putting comma separated integers from a text file into an array
Obtain number of token in a string with java Scanner
【问题讨论】:
你应该告诉使用什么不起作用。并且“方法2”和“方法3”是相等的。 嗨,汤姆,谢谢您的回答。这两种方法都不起作用,我无法理解如何获得它。你能多介绍一下吗?感谢四位您的快速回复。 再次确定:“没用”不会帮助任何人了解您的问题出在哪里。例如方法 2:如果取消最后几行的注释,什么不起作用? 嗨,汤姆,我尝试打印 ArrayList 并且它是空的,即使我使用方法 1 和方法 2 保存了它。这不起作用。你认为我使用的正则表达式很好吗? 我也试过了。看起来它确实有效。结论是它没有做你想让它做的事情。因此,您需要通过示例更清楚地描述您想要什么。 【参考方案1】:您可以指定正则表达式[|\n]
作为Scanner
的分隔符,例如:
Scanner scanner = new Scanner("0|0.20\n1|0.10\n2|0.20\n");
scanner.useDelimiter(Pattern.compile("[|\n]"));
System.out.println(scanner.nextInt());
System.out.println(scanner.nextDouble());
System.out.println(scanner.nextInt());
System.out.println(scanner.nextDouble());
要将值读入列表:
Scanner scanner = new Scanner("0|0.20\n1|0.10\n2|0.20\n");
scanner.useDelimiter(Pattern.compile("[|\n]"));
List<Integer> intList = new ArrayList<>();
List<Double> doubleList = new ArrayList<>();
while (scanner.hasNext())
intList.add(scanner.nextInt());
doubleList.add(scanner.nextDouble());
System.out.println(intList);
System.out.println(doubleList);
如果输入文件是 DOS 格式,
那么分隔符模式需要更复杂一些,
因为行尾是\r\n
。
此模式将支持 DOS 和 UNIX 行尾:
scanner.useDelimiter(Pattern.compile("[|\n]|(\r\n)"));
【讨论】:
嗯,它是由这些行组成的文件。我也在尝试使用 \n 换行。 PS:我想,我需要把File放在新的Scanner参数中。 我使用了一个字符串来进行可重现的演示。是的,写new Scanner(new File(dirPath+"/File.dat"))
它应该可以工作
嗨 Janos 非常感谢您的回复。我尝试了您的代码并收到以下错误:线程“main”中的异常 java.util.InputMismatchException
格式是.dat,文件看起来和我展示的完全一样。 End 行没有\n。它是具有以下值的文件:7|0.67
超酷!哇。多么棒的答案!我真的很感激你的知识。 :) 万分感谢。我自己与这个问题斗争了将近 8 个小时。再次感谢!!!!!!!以上是关于如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数的主要内容,如果未能解决你的问题,请参考以下文章