在 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
的包装材料。我们将使用CSVReader
的readNext()
方法逐行读取文件。它返回一个字符串数组,我们不需要担心拆分行。
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 文件的每一行代表一条记录。我们可以使用BufferedReader
或Scanner
轻松读取基本 CSV 文件中的数据。但是我们在阅读更复杂的 CSV 文件时,可能得不到预期的结果。读取 CSV 文件最简单的方法是使用像OpenCSV
这样的外部库。