将不一致的文件读取到 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
- 格式为:id1,id2,yyyy/mm/dd,price,id3.
- id3可以有多个(有些行数据比较多)
数据类型有: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]
我有一个包含以下数据的文件:
19387,73616,11/10/2021,7268,8271
81716,16381,11/10/2021,2736,3715,7362,837
75464,27315,11/10/2021,,3545,7645,460
- 格式为:id1,id2,yyyy/mm/dd,price,id3.
- id3可以有多个(有些行数据比较多)
数据类型有: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]