我们可以使用Java Scanner
类来读取CSV文件并转换为java bean的集合。例如,有一个如下所示的CSV文件。
employees.csv
1001,Maxsu,Developer,17000 RMB
1002,Marry,Programmer,14000 RMB
1003,CurryLee,Developer,15000 RMB
1004,David,QA Lead,9000 RMB
下面是一个java Bean类,它映射到CSV文件中的每列。
文件:Employee.java
public class Employee {
private int id;
private String name;
private String role;
private String salary;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
@Override
public String toString(){
return "ID="+getId()+"::Name"+getName()+"::Role="+getRole()+"::Salary="+getSalary();
}
}
假设Employee
变量映射到CSV文件中的以下列。
第一列 => Employee ID
第二列 => Employee Name
第三列 => Employee Role
第四列 => Employee Salary
现在可以使用Scanner
类来解析CSV文件并创建Employees
集合。
文件:ReadCSVWithScanner.java -
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ReadCSVWithScanner {
public static void main(String[] args) throws IOException {
// open file input stream
BufferedReader reader = new BufferedReader(new FileReader(
"employees.csv"));
// read file line by line
String line = null;
Scanner scanner = null;
int index = 0;
List<Employee> empList = new ArrayList<>();
while ((line = reader.readLine()) != null) {
Employee emp = new Employee();
scanner = new Scanner(line);
scanner.useDelimiter(",");
while (scanner.hasNext()) {
String data = scanner.next();
if (index == 0)
emp.setId(Integer.parseInt(data));
else if (index == 1)
emp.setName(data);
else if (index == 2)
emp.setRole(data);
else if (index == 3)
emp.setSalary(data);
else
System.out.println("invalid data::" + data);
index++;
}
index = 0;
empList.add(emp);
}
//close reader
reader.close();
System.out.println(empList);
}
}
请注意,我们将扫描仪分隔符设置为逗号(,
)。如果输入文件使用了一些其他分隔符,例如竖线(|
)或井号(#
),那么需要做的就是更改上面程序中的分隔符模式。
当运行上面的程序,它打印以下输出。
[ID=1001::NameMaxsu::Role=Developer::Salary=17000 RMB,
ID=1002::NameMarry::Role=Programmer::Salary=14000 RMB,
ID=1003::NameCurryLee::Role=Developer::Salary=15000 RMB,
ID=1004::NameDavid::Role=QA Lead::Salary=9000 RMB]
如果查看Scanner
类构造函数,应该看到它接受File
或InputStream
作为输入。它还包含实用程序方法hasNextLine()
和nextLine()
,这里只使用Scanner
类解析CSV文件。
文件:CSVScannerExample.java -
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CSVScannerExample {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(new File("employees.csv"));
Scanner dataScanner = null;
int index = 0;
List<Employee> empList = new ArrayList<>();
while (scanner.hasNextLine()) {
dataScanner = new Scanner(scanner.nextLine());
dataScanner.useDelimiter(",");
Employee emp = new Employee();
while (dataScanner.hasNext()) {
String data = dataScanner.next();
if (index == 0)
emp.setId(Integer.parseInt(data));
else if (index == 1)
emp.setName(data);
else if (index == 2)
emp.setRole(data);
else if (index == 3)
emp.setSalary(data);
else
System.out.println("invalid data::" + data);
index++;
}
index = 0;
empList.add(emp);
}
scanner.close();
System.out.println(empList);
}
}
如果运行上面的程序,产生的输出将与上述程序相同。如果只需解析一个简单的CSV文件,Scanner
类就是一个不错的选择。