CSV stands for Comma Seperated Values. A CSV file is used for data storage, it looks like a normal text file containing organised information seperated by a delimiter Comma. There are many ways of Reading and Parsing a CSV file, in this example we will look into the below three methods
- Using BufferedReader and String.split()
- Using Scanner of Java Util package
- Using 3rd party library like OpenCSV
We will be reading the Employee.csv
EmployeeID,FirstName,LastName,Salary 1,FirstName1,LastName1,10000 2,FirstName2,LastName2,20000 3,FirstName3,LastName3,30000 4,FirstName4,LastName4,40000 5,FirstName5,LastName5,50000
Employee.java
Before getting into parsing stuff, we have a pojo called Employee to hold Employee details such as EmpId, FirstName, LastName, Salary.
package com.javainterviewpoint; public class Employee { private int empId; private String firstName; private String lastName; private int salary; public Employee(int empId, String firstName, String lastName, int salary) { super(); this.empId = empId; this.firstName = firstName; this.lastName = lastName; this.salary = salary; } public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public String toString() { return "Employee [empId=" + empId + ", firstName=" + firstName + ", lastName=" + lastName + ", salary=" + salary + "]"; } }
1. Using Buffered Reader and String.split()
BufferedReader we will read the CSV file and String.split() method will split the string into token based on the delimiter passed which is COMMA here
package com.javainterviewpoint; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ReadCSVFile_BufferedReader { //Delimiters used in the CSV file private static final String COMMA_DELIMITER = ","; public static void main(String args[]) { BufferedReader br = null; try { //Reading the csv file br = new BufferedReader(new FileReader("Employee.csv")); //Create List for holding Employee objects List<Employee> empList = new ArrayList<Employee>(); String line = ""; //Read to skip the header br.readLine(); //Reading from the second line while ((line = br.readLine()) != null) { String[] employeeDetails = line.split(COMMA_DELIMITER); if(employeeDetails.length > 0 ) { //Save the employee details in Employee object Employee emp = new Employee(Integer.parseInt(employeeDetails[0]), employeeDetails[1],employeeDetails[2], Integer.parseInt(employeeDetails[3])); empList.add(emp); } } //Lets print the Employee List for(Employee e : empList) { System.out.println(e.getEmpId()+" "+e.getFirstName()+" " +e.getLastName()+" "+e.getSalary()); } } catch(Exception ee) { ee.printStackTrace(); } finally { try { br.close(); } catch(IOException ie) { System.out.println("Error occured while closing the BufferedReader"); ie.printStackTrace(); } } } }
Output :
1 FirstName1 LastName1 10000 2 FirstName2 LastName2 20000 3 FirstName3 LastName3 30000 4 FirstName4 LastName4 40000 5 FirstName5 LastName5 50000
2. Using Scanner of Java Util package
Scanner breaks the input into tokens based on the delimiter passed(Default is White Space), here we are using COMMA as delimieter.
package com.javainterviewpoint; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class ReadCSV_Scanner { //Delimiters used in the CSV file private static final String COMMA_DELIMITER = ","; public static void main(String args[]) { Scanner scanner = null; try { //Get the scanner instance scanner = new Scanner(new File("Employee.csv")); //Use Delimiter as COMMA scanner.useDelimiter(COMMA_DELIMITER); while(scanner.hasNext()) { System.out.print(scanner.next()+" "); } } catch (FileNotFoundException fe) { fe.printStackTrace(); } finally { scanner.close(); } } }
Output :
EmployeeID FirstName LastName Salary 1 FirstName1 LastName1 10000 2 FirstName2 LastName2 20000 3 FirstName3 LastName3 30000 4 FirstName4 LastName4 40000 5 FirstName5 LastName5 50000
3. Using OpenCSV
OpenCSV is a Third party library, it gives better handliling to parse a CSV file.
package com.javainterviewpoint; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import au.com.bytecode.opencsv.CSVReader; public class ReadCSV_OpenCSV { public static void main(String args[]) { CSVReader csvReader = null; try { /** * Reading the CSV File * Delimiter is comma * Start reading from line 1 */ csvReader = new CSVReader(new FileReader("Employee.csv"),',','"',1); //employeeDetails stores the values current line String[] employeeDetails = null; //Create List for holding Employee objects List<Employee> empList = new ArrayList<Employee>(); while((employeeDetails = csvReader.readNext())!=null) { //Save the employee details in Employee object Employee emp = new Employee(Integer.parseInt(employeeDetails[0]), employeeDetails[1],employeeDetails[2], Integer.parseInt(employeeDetails[3])); empList.add(emp); } //Lets print the Employee List for(Employee e : empList) { System.out.println(e.getEmpId()+" "+e.getFirstName()+" " +e.getLastName()+" "+e.getSalary()); } } catch(Exception ee) { ee.printStackTrace(); } } }
Output :
1 FirstName1 LastName1 10000 2 FirstName2 LastName2 20000 3 FirstName3 LastName3 30000 4 FirstName4 LastName4 40000 5 FirstName5 LastName5 50000
priya says
DataInputStream consumes less amount of memory space being it is binary stream, where as BufferedReader consumes more memory space being it is character stream. Many thanks for sharing.