Java中使用Scanner读取CSV文件
时间:2020-02-23 14:34:37 来源:igfitidea点击:
我们可以使用Java扫描程序类在Java中读取CSV文件。
Java中读取CSV文件
我们可以使用Java Scanner类读取CSV文件并将其转换为Java bean的集合。
例如,我们可能有一个如下所示的CSV文件。
employees.csv
1,hyman Kumar,Developer,5000 USD 2,Mani,Programmer,4000 USD 3,Avinash,Developer,5000 USD 4,David,QA Lead,4000 USD
而且我们有一个Java Bean,它映射到CSV文件中的不同列。
Employee.java
package com.theitroad.csv;
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 "\nID="+getId()+"::Name"+getName()+"::Role="+getRole()+"::Salary="+getSalary();
}
}
假设员工bean变量映射到CSV文件中的以下列。
第一列–员工ID第二列–员工姓名第三列–员工角色第四列–员工薪水
现在,我们可以使用Scanner类来解析CSV文件并创建员工集合。
ReadCSVWithScanner.java
package com.theitroad.csv;
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=1::Namehyman Kumar::Role=Developer::Salary=5000 USD, ID=2::NameMani::Role=Programmer::Salary=4000 USD, ID=3::NameAvinash::Role=Developer::Salary=5000 USD, ID=4::NameDavid::Role=QA Lead::Salary=4000 USD]
如果查看Scanner类的构造函数,您会注意到它接受File或者InputStream作为输入。
它还包含实用程序方法" hasNextLine()"和" nextLine()",我们只能使用"扫描程序"来解析CSV文件。
CSVScannerExample.java
package com.theitroad.csv;
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类是一个不错的选择。

