How to read CSV files in Java

6

I'm developing a web application, where after the user uploads a CSV file, my java application needs to read this CSV. Preferably separate the data into fields, so that you can add these to a database for example.

After some research done on the web, some examples I understood, in the java code already brings the defined fields that the csv file has. Is it possible to scan the file even though I do not know how many fields the line has? Because I can have files being sent to the application with different fields.

    
asked by anonymous 29.07.2014 / 20:31

3 answers

8

If you do a split of the lines and a map or even a list to save each position will have no problem, then each line is just looping for each element resulting from the split.

The example below is very simplified, but it will give you a sense of how to proceed. See, I can pick up the last elements "unknowingly" as many as they have on the line. Similarly, you have to make a for the country.length to iterate over the various elements of your csv.

file.csv

"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.3.255","16777472","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"
"1.0.16.0","1.0.31.255","16781312","16785407","JP","Japão"
"1.0.32.0","1.0.63.255","16785408","16793599","BR","Brasil"
"1.0.64.0","1.0.127.255","16793600","16809983","JP","Japão"
"1.0.128.0","1.0.255.255","16809984","16842751","DK","Dinamarca"

stack. ReadCVS.java

package stack;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class LeiaCVS {

  public static void main(String[] args) {

    LeiaCVS obj = new LeiaCVS();
    obj.run();

  }

  public void run() {

    String arquivoCSV = "arquivo.csv";
    BufferedReader br = null;
    String linha = "";
    String csvDivisor = ",";
    try {

        br = new BufferedReader(new FileReader(arquivoCSV));
        while ((linha = br.readLine()) != null) {

            String[] pais = linha.split(csvDivisor);

            System.out.println("País [code= " + pais[pais.length-2] 
                                 + " , name=" + pais[pais.length-1] + "]");

        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  }

}
    
29.07.2014 / 21:36
5

Dude, you can just use OpenCVS ( link )

To adapt and use it, just use the following code:

public class ParseCSV {
public static void main(String[] args) {
try {
  //csv file containing data
  String strFile = "C:\Users\rsaluja\CMS_Evaluation\Drupal_12_08_27.csv";
  CSVReader reader = new CSVReader(new FileReader(strFile));
  String [] nextLine;
  int lineNumber = 0;
  while ((nextLine = reader.readNext()) != null) {
    lineNumber++;
    System.out.println("Line # " + lineNumber);

    // nextLine[] is an array of values from the line
    System.out.println(nextLine[4] + "etc...");
  }
 }
}
}
    
29.07.2014 / 21:41
2

The code below reads the records of a CSV file using OpenCSV.

In this example we get a List<String[]> .

    Reader reader = Files.newBufferedReader(Paths.get("nome-do-arquivo.csv"));
    CSVReader csvReader = new CSVReaderBuilder(reader)
                            .withSkipLines(1)//para o caso do CSV ter cabeçalho.
                            .build();

    List<String[]> linhas = csvReader.readAll();
    for (String[] linha : linhas)
        for (String[] coluna : linha)
            System.out.print(coluna + " # ");
        System.out.println();

Important: You need to add OpenCSV as a dependency in your project. If you are using maven, just add:

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>4.2</version>
</dependency>

Reference: link

    
18.07.2018 / 21:28