如何阅读Pipe delimited Line |来自两个不同的ArrayList

时间:2015-10-29 21:23:16

标签: java arrays regex file arraylist

程序需要从文件中解释管道分隔的行并将其存储在两个不同的ArrayLists中。我已经尝试了StackOverflow上的几乎所有相关链接,并且知道了|是一项特殊的操作,因此保留。所以我找到了其他几种读取线条的方法,但没有一种方法可以正常工作。

以下是我的情景:

文本文件如下所示:

  

0 | 0.20
  1个| 0.10
  2 | 0.20

依旧......

第一个Integer需要转到ArrayList a1,而第二个浮点数需要在管道定界符之后转到ArrayList a2

我尝试使用扫描仪,然后使用拆分拆分线条。将它们保存到String然后进行String转换。我使用了以下方法:

方法1:

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);
        }
    }

方法2:

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]))

方法3:

try(BufferedReader in = new BufferedReader(new FileReader(dirPath+"/File.dat"))){
          String line;
          while((line = in.readLine())!=null){
              String[] pair = line.split("\\|",-1);

我还使用了其他几种方法,例如扫描仪,但无法获得结果。我有几个类似于上面的文件,我需要读取它们以将其保存在ArrayList中进行处理。

PS:其中一个文件有三个数据,如:

  

1 | 0.21 | 0.37
  2 | 0.08 | 0.12

等等。我猜。这很容易,类似于两个分隔符过程。 PS:我在Linux Eclipse IDE上开发,所以路径是:

/home/user/workspace1/Java_Code

我从main函数发送路径为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

1 个答案:

答案 0 :(得分: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)"));