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