CSV reader and writer example

Click here to download eclipse supported ZIP file



This is CsvReader.java file having the source code to execute business logic.



 

    
package com.cv.csv;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 @author Chandra Vardhan
 *
 */
public class CsvReader {  

  public static List<Map<String, String>> readSpecifiedColumns(final String absoluteFilePathString,
      final int... retrieveColumns) {
    Map<Integer, String[]> allRows = readCSVFile(absoluteFilePathString);
    ArrayList<Map<String, String>> fileInfo = new ArrayList<Map<String, String>>();
    for (Entry<Integer, String[]> hashMap : allRows.entrySet()) {
      String[] row = hashMap.getValue();
      Map<String, String> tempMap = new HashMap<String, String>();
      if (row != null && row.length > 0) {
        if (retrieveColumns != null && retrieveColumns.length > 0) {
          for (int columnInt : retrieveColumns) {
            tempMap.put("" + columnInt, row[columnInt]);
          }
        else {
          for (int j = 0; j < row.length; ++j) {
            tempMap.put("" + j, row[j]);
          }
        }
      }
      fileInfo.add(tempMap);
      tempMap = null;
    }
    allRows = null;
    return fileInfo;
  }

  public static List<Map<String, String>> readSpecifiedColumns(final String absoluteFilePathString,
      final String... retrieveColumns) {
    Map<Integer, String[]> allRows = readCSVFile(absoluteFilePathString);
    ArrayList<Map<String, String>> fileInfo = new ArrayList<Map<String, String>>();
    int[] retrieveValues = new int[retrieveColumns.length];
    boolean flag = false;
    for (Entry<Integer, String[]> hashMap : allRows.entrySet()) {
      Integer key = hashMap.getKey();
      String[] row = hashMap.getValue();
      if (key == 0) {
        int retrieveRow = 0;
        for (int i = 0; i < row.length; i++) {
          String string2 = row[i];
          for (int k = 0; k < retrieveColumns.length; ++k) {
            String column = retrieveColumns[k];
            if (column != null && column.equalsIgnoreCase(string2)) {
              flag = true;
              retrieveValues[retrieveRow= i;
              ++retrieveRow;
            }
          }

        }
        continue;
      }
      Map<String, String> tempMap = new HashMap<String, String>();
      if(flag) {
      if (row != null && row.length > 0) {
        if (retrieveValues != null && retrieveValues.length > 0) {
          for (int columnInt : retrieveValues) {
            tempMap.put("" + columnInt, row[columnInt]);
          }
        else {
          for (int j = 0; j < row.length; ++j) {
            tempMap.put("" + j, row[j]);
          }
        }
      }
      fileInfo.add(tempMap);
      }
      tempMap = null;
    }
    allRows = null;
    return fileInfo;
  }

  public static Map<Integer, String[]> readSpecifiedRows(final String absoluteFilePathString,
      final int... retrieveRows) {
    Map<Integer, String[]> allRows = readCSVFile(absoluteFilePathString);
    Map<Integer, String[]> fileInfo = new HashMap<Integer, String[]>();
    for (int retrieveRow : retrieveRows) {
      String[] row = allRows.get(retrieveRow);
      if (row != null && row.length > 0) {
        fileInfo.put(retrieveRow, row);
      }
    }
    allRows = null;
    return fileInfo;
  }

  public static Map<Integer, String[]> readCSVFile(final String absoluteFilePathString) {
    BufferedReader fileReader = null;
    // Delimiter used in CSV file
    String DELIMITER = ",";
    Map<Integer, String[]> map = new HashMap<Integer, String[]>();
    try {
      String line = "";
      // Create the file reader
      fileReader = new BufferedReader(new FileReader(absoluteFilePathString));
      int count = 0;
      // Read the file line by line
      while ((line = fileReader.readLine()) != null) {
        if (count == 0) {
          if (line.contains("\",\"")) {
            String[] countMatches = line.split("\",\"");
            if (countMatches.length > 1) {
              DELIMITER = "\",\"";
            }
          }
          if (line.contains("\t")) {
            String[] countMatches = line.split("\t");
            String[] countMatchesComma = line.split(",");
            if (countMatches.length > && countMatchesComma.length <= 1) {
              DELIMITER = "\t";
            }
          }
        }
        String[] values = line.split(DELIMITER);
        if (values != null && values.length > 1) {
          String first = values[0];
          if (first != null && first.startsWith("\"")) {
            values[0= first.substring(1, first.length());
          }
          String last = values[values.length - 1];
          if (last != null && last.endsWith("\"")) {
            values[values.length - 1= last.substring(0, last.length() 1);
          }
          map.put(count, values);
        }
        ++count;
      }

    catch (Exception e) {
      System.err.println("Specified file " + absoluteFilePathString
          " is not available / unable to read. Please provide absolute file path.");
      e.printStackTrace();
    finally {
      try {
        fileReader.close();
      catch (IOException e) {
        e.printStackTrace();
      }
    }
    return map;
  }

  public static List<String[]> readCSVFileList(final String absoluteFilePathString) {
    BufferedReader fileReader = null;
    // Delimiter used in CSV file
    String DELIMITER = ",";
    List<String[]> list = new ArrayList<String[]>();
    try {
      String line = "";
      // Create the file reader
      fileReader = new BufferedReader(new FileReader(absoluteFilePathString));
      int count = 0;
      // Read the file line by line
      while ((line = fileReader.readLine()) != null) {
        if (count == 0) {
          if (line.contains("\",\"")) {
            String[] countMatches = line.split("\",\"");
            if (countMatches.length > 1) {
              DELIMITER = "\",\"";
            }
          }
          if (line.contains("\t")) {
            String[] countMatches = line.split("\t");
            String[] countMatchesComma = line.split(",");
            if (countMatches.length > && countMatchesComma.length <= 1) {
              DELIMITER = "\t";
            }
          }
        }
        String[] values = line.split(DELIMITER);
        if (values != null && values.length > 1) {
          String first = values[0];
          if (first != null && first.startsWith("\"")) {
            values[0= first.substring(1, first.length());
          }
          String last = values[values.length - 1];
          if (last != null && last.endsWith("\"")) {
            values[values.length - 1= last.substring(0, last.length() 1);
          }
          list.add(values);
        }
        ++count;
      }

    catch (Exception e) {
      System.err.println("Specified file " + absoluteFilePathString
          " is not available / unable to read. Please provide absolute file path.");
      e.printStackTrace();
    finally {
      try {
        fileReader.close();
      catch (IOException e) {
        e.printStackTrace();
      }
    }
    return list;
  }

  public static Map<String, Map<String, String>> readSpecifiedRowsSpecifiedColumns(
      final String absoluteFilePathString, final int[] retrieveRows, final int... retriveColumns) {
    Map<Integer, String[]> allRows = readCSVFile(absoluteFilePathString);
    Map<String, Map<String, String>> fileInfo = new HashMap<String, Map<String, String>>();
    for (int retrieveRow : retrieveRows) {
      String[] row = allRows.get(retrieveRow);
      Map<String, String> tempMap = new HashMap<String, String>();
      if (row != null && row.length > 0) {
        if (retriveColumns != null && retriveColumns.length > 0) {
          for (int columnInt : retriveColumns) {
            tempMap.put("" + columnInt, row[columnInt]);
          }
        else {
          for (int j = 0; j < row.length; ++j) {
            tempMap.put("" + j, row[j]);
          }
        }
      }
      fileInfo.put("" + retrieveRow, tempMap);
      tempMap = null;
    }
    allRows = null;
    return fileInfo;
  }

  public static Map<String, Map<String, String>> readSpecifiedRowSpecifiedColumn(final String absoluteFilePathString,
      final int retrieveRow, final int... retrieveColumns) {
    Map<Integer, String[]> allRows = readCSVFile(absoluteFilePathString);
    Map<String, Map<String, String>> fileInfo = new HashMap<String, Map<String, String>>();
    String[] row = allRows.get(retrieveRow);
    Map<String, String> tempMap = new HashMap<String, String>();
    if (row != null && row.length > 0) {
      if (retrieveColumns != null && retrieveColumns.length > 0) {
        for (int columnInt : retrieveColumns) {
          tempMap.put("" + columnInt, row[columnInt]);
        }
      else {
        for (int j = 0; j < row.length; ++j) {
          tempMap.put("" + j, row[j]);
        }
      }
    }
    fileInfo.put("" + retrieveRow, tempMap);
    row = null;
    tempMap = null;
    allRows = null;
    return fileInfo;
  }

}


This is CsvWriter.java file having the source code to execute business logic.



 

    
package com.cv.csv;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;

/**
 @author Chandra Vardhan
 *
 */
public class CsvWriter {

  private static final String DEFAULT_SEPARATOR = ",";
  private static final String COMMA_SEPARATOR = ",";
  private static final String TAB_SEPARATOR = "\t";

  public static void writerToFile(final String file, final List<String[]> fileDatathrows IOException {
    FileWriter out = null;
    try {
      if (file != null) {
        out = new FileWriter(file);
        for (String[] values : fileData) {
          writeLine(out, Arrays.asList(values));
        }
      }
    catch (Exception e) {
      throw new IOException();
    finally {
      if (out != null) {
        out.close();
      }
    }
  }

  public static void writeToFileByDelimiter(final String file, final List<String[]> fileData, final String lineSperatorthrows IOException {
    FileWriter out = null;
    try {
      if (file != null) {
        out = new FileWriter(file);
        for (String[] values : fileData) {
          writeLine(out, Arrays.asList(values), lineSperator);
        }
      }
    catch (Exception e) {
      throw new IOException();
    finally {
      if (out != null) {
        out.close();
      }
    }
  }

  public static void writeToFile(final FileWriter file, final List<String[]> fileDatathrows IOException {
    if (file != null) {
      for (String[] values : fileData) {
        writeLine(file, Arrays.asList(values));
      }
    }
  }

  public static void writeLines(final String file, final List<String[]> fileDatathrows IOException {
    for (String[] values : fileData) {
      writeLine(new FileWriter(new File(file)), Arrays.asList(values), DEFAULT_SEPARATOR, " ");
    }
  }

  public static void writeLine(final String file, final List<String> valuesthrows IOException {
    writeLine(new FileWriter(new File(file)), values, DEFAULT_SEPARATOR, " ");
  }

  public static void writeLine(final Writer w, final List<String> valuesthrows IOException {
    writeLine(w, values, DEFAULT_SEPARATOR, " ");
  }

  public static void writeLine(final Writer w, final List<String> values, final String separators)
      throws IOException {
    writeLine(w, values, separators, " ");
  }

  // https://tools.ietf.org/html/rfc4180
  private static String followCVSformat(final String value) {

    String result = value;
    if (result.contains("\"")) {
      result = result.replace("\"""\"\"");
    }
    return result;

  }

  public static void writeLine(final Writer w, final List<String> values, final String separators,
      final String customQuotethrows IOException {

    boolean first = true;
    String separator = separators;

    // default customQuote is empty

    if (separator != null && (separator.equals(""|| separator.trim().equals(""))) {
      separator = TAB_SEPARATOR;
    else if (separator != null && (separator.equals(","|| separator.trim().equals(","))) {
      separator = COMMA_SEPARATOR;
    else {
      separator = DEFAULT_SEPARATOR;
    }

    StringBuilder sb = new StringBuilder();
    for (String value : values) {
      if (!first) {
        sb.append(separator);
      }
      if (customQuote != null && (customQuote.equals(""|| customQuote.trim().equals(""))) {
        sb.append(followCVSformat(value));
      else {
        sb.append(customQuote).append(followCVSformat(value)).append(customQuote);
      }

      first = false;
    }
    sb.append("\n");
    w.append(sb.toString());

  }

  public static void writeLine(final String file, final List<String> values, final String separators,
      final String customQuotethrows IOException {

    FileWriter fileWriter = new FileWriter(new File(file));
    boolean first = true;
    String separator = separators;
    // default customQuote is empty

    if (separator != null && (separator.equals(""|| separator.trim().equals(""))) {
      separator = TAB_SEPARATOR;
    else if (separator != null && (separator.equals(","|| separator.trim().equals(","))) {
      separator = COMMA_SEPARATOR;
    else {
      separator = DEFAULT_SEPARATOR;
    }

    StringBuilder sb = new StringBuilder();
    for (String value : values) {
      if (!first) {
        sb.append(separator);
      }
      if (customQuote != null && (customQuote.equals(""|| customQuote.trim().equals(""))) {
        sb.append(followCVSformat(value));
      else {
        sb.append(customQuote).append(followCVSformat(value)).append(customQuote);
      }

      first = false;
    }
    sb.append("\n");
    fileWriter.append(sb.toString());
    fileWriter.flush();
    fileWriter.close();

  }
}


This is TestCsvReader.java file having the source code to execute business logic.



 

    
/**
 
 */
package com.cv.csv;

import java.net.URL;
import java.util.Map;

/**
 @author Chandra Vardhan
 *
 */
public class TestCsvReader {

  private static URL url = null;

  static {
    url = TestCsvReader.class.getClassLoader().getResource("test.csv");
  }

  /**
   @param args
   */
  public static void main(String[] args) {

    String fileToParse = url.getPath();
    Map<Integer, String[]> readAll = CsvReader.readCSVFile(fileToParse);
    System.out.println(readAll);

    System.out.println(fileToParse);
    System.out.println(CsvReader
        .readSpecifiedRowsSpecifiedColumns(fileToParse, new int[] { 01}012));
    System.out.println(CsvReader
        .readSpecifiedRowsSpecifiedColumns(fileToParse, new int[] { 0}21));
    System.out.println(CsvReader
        .readSpecifiedRowsSpecifiedColumns(fileToParse, new int[] { }2));


    System.out.println("=======================================================================================");

    System.out.printlnCsvReader.readCSVFile(fileToParse));

    System.out.println("=======================================================================================");

    System.out.println(CsvReader.readSpecifiedColumns(fileToParse, new String[]{"Address","Designation"}));

    System.out.println("=======================================================================================");

    System.out.println(CsvReader.readSpecifiedColumns(fileToParse, 3));
    
    System.out.println("=======================================================================================");

    System.out.println(CsvReader.readSpecifiedRows(fileToParse, 2));
    
    System.out.println("=======================================================================================");

    System.out.println(CsvReader.readSpecifiedRowSpecifiedColumn(fileToParse, 31));

  }

}


This is TestCsvWriter.java file having the source code to execute business logic.



 

    
/**
 
 */
package com.cv.csv;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;

/**
 @author Chandra Vardhan
 *
 */
public class TestCsvWriter {

  private static URL url = null;

  static {
    url = TestCsvWriter.class.getClassLoader().getResource("test.csv");
  }

  /**
   @param args
   */
  public static void main(String[] args) {

    String fileToParse = url.getPath();
    List<String[]> readCSVFileList = CsvReader.readCSVFileList(fileToParse);
    System.out.println(readCSVFileList);
    String writeFile = fileToParse.replace("test.csv""test2.csv");
    File file = new File(writeFile);
    if (!file.exists()) {
      try {
        file.createNewFile();
      catch (IOException e) {
        e.printStackTrace();
      }
    }

    try {
      CsvWriter.writerToFile(writeFile, readCSVFileList);
    catch (IOException e) {
      e.printStackTrace();
    }

  }

}


This is pom.xml file having the entries of dependency jars and information to build the application .



	
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cv.csv</groupId> <artifactId>csvreadwrite</artifactId> <version>1.0</version> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </pluginManagement> <finalName>csvreadwrite</finalName> </build> </project>


This is log4j.properties file having the entries for logging the information into the console/file.




#By default enabling Console appender
# Root logger option
log4j.rootLogger=INFO, stdout

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p [%c]:%L -->> %m%n

# Redirect log messages to a log file
#log4j.appender.file=org.apache.log4j.RollingFileAppender
#log4j.appender.file.File=C:\servlet-application.log
#log4j.appender.file.MaxFileSize=5MB
#log4j.appender.file.MaxBackupIndex=10
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n


No comments:

Post a Comment