将不一致的文件读取到 arraylist java

Read inconsistent file to arraylist java

我有一个包含以下数据的文件:

19387,73616,11/10/2021,7268,8271
81716,16381,11/10/2021,2736,3715,7362,837
75464,27315,11/10/2021,,3545,7645,460

数据类型有:int、int、string、float、arraylist integer。所以在这里,我只想将 id3 读取为整数 arraylist

到目前为止我的代码:

Public static void main(String[] args){

  //variables
  int id1;
  int id2;
  String date;
  float price;
  ArrayList<Integer> id3List = new ArrayList<>();

  //check if file exists
  try {
      //get file
      File myFile = new File (“fileName.txt“);

      //pass file object to create scanner object
      Scanner inputFile = new Scanner ("myFile").useDelimiter(",|\r|\n");
      
      //read lines from file and store into respective variables
      try {
        While (inputFile.hasNextInt){
          id1 = inputFile.nextInt();
          id2 = inputFile.nextInt();
          date = inputFile.next();
          price = inputFile.nextFloat();
          id3.add(inputFile.nextInt());

          inputFile.nextLine(); //consume a line 

      } catch(InputMismatchException e){
        System.out.println("Bad data in file.");
      }
       System.out.println(id3);

       inputFile.close(); //close file

  } catch(FileNotFoundException e) {
     System.out.println("The file was not found.");
    }
}

我得到的结果只显示第一个 id3 而忽略其余的:

[8271, 3715, 7645]

注意:我只会为此使用扫描仪,而不是缓冲 reader。

您非常接近实际的解决方案。在这种情况下,当找不到更多整数时,inputFile.nextInt() 将 return NULL。这就是为什么我们可以使用 while 循环来附加到数组。

while(inputFile.nextInt())
{
     id3.add(inputFile.nextInt());
}

我要做的第一件事是将文件的解析与文本的解析分开。

也就是说,从文件中读取一行文本,然后使用单独的 Scanner 解析该行。

这使您可以将逻辑和工作流程分开,而不会弄乱它(但是,这就是我)。

您还需要考虑到如果 price 为空,您将有一个悬挂元素,应该读取(并丢弃)。

最后,利用hasNextInt遍历剩余的标记

例如...

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner("""
                                      19387,73616,11/10/2021,7268,8271
                                      81716,16381,11/10/2021,2736,3715,7362,837
                                      75464,27315,11/10/2021,,3545,7645,460
                                      """);
        while (scanner.hasNextLine()) {
            Scanner line = new Scanner(scanner.nextLine()).useDelimiter(",");
            int id1 = line.nextInt();
            int id2 = line.nextInt();
            String date =  line.next();

            float price = 0;
            if (line.hasNextFloat()) {
                price = line.nextFloat(); 
            } else {
                line.next();
            }

            System.out.println(id1);
            System.out.println(id2);
            System.out.println(date);
            System.out.println(price);

            List<Integer> otherIds = new ArrayList<>(25);
            while (line.hasNextInt()) {
                otherIds.add(line.nextInt());
            }

            System.out.println(otherIds);

            System.out.println();
        }
    }
}

这将打印...

19387
73616
11/10/2021
7268.0
[8271]

81716
16381
11/10/2021
2736.0
[3715, 7362, 837]

75464
27315
11/10/2021
0.0
[3545, 7645, 460]