在 Java 中读取 CSV 文件

原文:https://www.studytonight.com/java-examples/reading-a-csv-file-in-java

CSV 代表逗号分隔值,是一种非常流行的File类型。CSV 文件用于存储由逗号分隔的信息。文件的每一行都用来表示一个数据记录。在本教程中,我们将学习如何读取 CSV 文件并将其内容复制到数组或列表中。在本教程中,我们将使用一个仅包含三条记录的简单 CSV 文件。文件的内容如下所示。

Justin, 101, 9.1
Jessica, 102, 8.7
Clark, 103, 7.1

使用BufferedReader读取 CSV 文件

java.io包的BufferedReader类可以用来读取基本的 CSV 文件。我们将使用readLine() 方法简单地阅读文件的每一行。然后我们可以使用split()方法并通过逗号作为分隔符来拆分行。

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
public class ReadingCSV
{
    public static void main(String[] args)
    {
        try
        {
            List< List<String> > data = new ArrayList<>();//list of lists to store data
            String file = "C:\\Users\\Lenovo\\Desktop\\demo.csv";//file path
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            //Reading until we run out of lines
            String line = br.readLine();
            while(line != null)
            {
                List<String> lineData = Arrays.asList(line.split(","));//splitting lines
                data.add(lineData);
                line = br.readLine();
            }

            //printing the fetched data
            for(List<String> list : data)
            {
                for(String str : list)
                    System.out.print(str + " ");
                System.out.println();
            }
            br.close();
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
    }
}

贾斯汀 101 9.1 杰西卡 102 8.7 克拉克 103 7.1

请注意,我们不能使用这种方法来读取更复杂的 CSV 文件或逗号本身是值的文件。例如,考虑一个 CSV 文件,其中第二列用于存储标点符号。

Full Stop,"."
Comma,","
Exclamation,"!"

如果我们试图读取这个文件,那么下面的数据就存储在列表中。我们可以看到文件的第二行没有存储任何值(逗号被省略了)。我们也不需要引号。

完全停止。” 逗号“ 感叹“!”

使用扫描仪类读取 CSV 文件

我们也可以使用java.util包的Scanner类读取一个 CSV 文件。这种方法与BufferedReader非常相似。我们将简单地读取文件的每一行,然后使用逗号作为分隔符将其拆分。然后我们可以将单个记录存储在列表中。

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Arrays;
public class ReadingCSV
{
    public static void main(String[] args)
    {
        try
        {
            List< List<String> > data = new ArrayList<>();//list of lists to store data
            String filePath = "C:\\Users\\Lenovo\\Desktop\\demo.csv";//file path
            File file = new File(filePath);
            Scanner s = new Scanner(file);            
            //Reading until we run out of lines
            while(s.hasNextLine())
            {
                List<String> lineData = Arrays.asList(s.nextLine().split(","));//splitting lines
                data.add(lineData);
            }            
            //printing the fetched data
            for(List<String> list : data)
            {
                for(String str : list)
                    System.out.print(str + " ");
                System.out.println();
            }
            s.close();
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
    }
}

贾斯汀 101 9.1 杰西卡 102 8.7 克拉克 103 7.1

就像BufferedReader一样,Scanner类方法不能用于复杂的 CSV 文件。

使用 opencv 库读取 csv 文件

OpenCSV是一个 CSV 文件解析库,可以让从 CSV 文件中读取变得容易很多。CSVReader被用作FileReader的包装材料。我们将使用CSVReaderreadNext() 方法逐行读取文件。它返回一个字符串数组,我们不需要担心拆分行。

import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.opencsv.CSVReader;
import java.util.Arrays;
public class ReadingCSV
{
    public static void main(String[] args)
    {
        try
        {
            List< List<String> > data = new ArrayList<>();//list of lists to store data
            String filePath = "C:\\Users\\Lenovo\\Desktop\\demo.csv";//file path
            FileReader fr = new FileReader(filePath);
            CSVReader reader = new CSVReader(fr);

            String[] lineData = reader.readNext();
            //Reading until we run out of lines
            while(lineData != null)
            {
                data.add(Arrays.asList(lineData));
                lineData = reader.readNext();
            }

            //printing the fetched data
            for(List<String> list : data)
            {
                for(String str : list)
                    System.out.print(str + " ");
                System.out.println();
            }
            reader.close();
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
    }
}

贾斯汀 101 9.1 杰西卡 102 8.7 克拉克 103 7.1

让我们将上面的代码用于 CSV 文件,其中我们有一个值为逗号的单元格。我们可以看到,逗号被CSVReader认为是一个值而不是一个分隔符。甚至报价被删除,数据以更好的格式呈现。

句号。 逗号, 感叹号!

摘要

CSV 文件用于存储由逗号(在某些情况下是分号)分隔的数据。CSV 文件的每一行代表一条记录。我们可以使用BufferedReaderScanner轻松读取基本 CSV 文件中的数据。但是我们在阅读更复杂的 CSV 文件时,可能得不到预期的结果。读取 CSV 文件最简单的方法是使用像OpenCSV这样的外部库。