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类是一个不错的选择。