如何阅读管道分隔线 |来自一个文件并在两个不同的 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 中拆分整数的主要内容,如果未能解决你的问题,请参考以下文章

如何从两个制表符分隔的文件中获取枢轴线?

如何播放来自两个不同来源的音频和视频?

如何使用管道分隔符导出到 .csv

比较来自两个不同表的两列的逗号分隔值

如何从管道分隔的文件中打印字段?

将一条线分成2个不同的字符串[重复]