Java IO 之 解析CSV文件

CSV文件用于存储在纯文本形式的表格数据。为了识别和分隔文件中的不同数据令牌,使用了定界符。这些文件供消费者,企业和科学应用程序使用。它最常见的用途是在本机以不兼容格式运行的程序之间移动表格数据。之所以可行,是因为有很多程序至少支持CSV的某种变体作为至少一种替代的导入/导出格式。

CSV文件

在Java中,有多种读取和解析CSV文件的方法。在本教程中,我将提供3种不同方式的示例。

  1. 使用java.util.Scanner
  2. 使用String.split()函数
  3. 使用第三方库(例如OpenCSV)

1)使用java.util.Scanner

扫描仪断开其输入到使用定界符图案,其由缺省匹配空白标记。然后,可以使用各种下一种方法将生成的令牌转换为不同类型的值。

package com.how2codex.csv.demoScanner;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ScannerExample 
{
	public static void main(String[] args) throws FileNotFoundException 
	{
		//Get scanner instance
		Scanner scanner = new Scanner(new File("SampleCSVFile.csv"));
		
		//Set the delimiter used in file
		scanner.useDelimiter(",");
		
		//Get all tokens and store them in some data structure
		//I am just printing them
		while (scanner.hasNext()) 
		{
			System.out.print(scanner.next() + "|");
		}
		
		//Do not forget to close the scanner  
		scanner.close();
	}
}

Output:

1|Lokesh|Gupta|how2codex.com|enabled
2|Rakesh|Gupta|how2codex.com|enabled
3|Manoj|Sharma|how2codex.com|enabled
4|Abhay|Dwivedi|how2codex.com|enabled
5|John|Adward|how2codex.com|enabled
6|Steve|Jobs|how2codex.com|disabled
7|Bill|Gates|how2codex.com|enabled
8|Tom|Hanks|how2codex.com|enabled
9|Dev|Patel|how2codex.com|disabled

2)使用String.split()函数

String.split()函数基于提供的定界符作为参数,将给定字符串中的标记创建为标记。

package com.how2codex.csv.demoSplit;

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

public class SplitterExample
{
	public static void main(String[] args)
	{
		//Input file which needs to be parsed
		String fileToParse = "SampleCSVFile.csv";
		BufferedReader fileReader = null;
		
		//Delimiter used in CSV file
		final String DELIMITER = ",";
		try 
		{
			String line = "";
			//Create the file reader
			fileReader = new BufferedReader(new FileReader(fileToParse));
			
			//Read the file line by line
			while ((line = fileReader.readLine()) != null) 
			{
				//Get all tokens available in line
				String[] tokens = line.split(DELIMITER);
				for(String token : tokens)
				{
					//Print all tokens
					System.out.println(token);
				}
			}
		} 
		catch (Exception e) {
			e.printStackTrace();
		} 
		finally 
		{
			try {
				fileReader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Output:

1
Lokesh
Gupta
how2codex.com
enabled
2
Rakesh
Gupta
how2codex.com
enabled

..More output will appear here

3)使用OpenCSV等第三方库

为此,您可以使用更强大的专用第三方工具库。一个示例是OpenCSV。这些库可以更好地控制输入CSV文件的处理,例如:

  • 每行任意数量的值
  • 忽略引号中的逗号
  • 处理跨多行的条目
  • 可配置的分隔符和引号字符
  • 一次读取所有条目,或使用Iterator样式模型
package com.how2codex.csv.demoOpenCSV;

import java.io.FileReader;
import java.io.IOException;

import au.com.bytecode.opencsv.CSVReader;

public class OpenCSVExample {
	
	public static void main(String[] args) 
	{
		CSVReader reader = null;
		try 
		{
			//Get the CSVReader instance with specifying the delimiter to be used
			reader = new CSVReader(new FileReader("SampleCSVFile.csv"),',');
			String [] nextLine;
			//Read one line at a time
		    while ((nextLine = reader.readNext()) != null) 
		    {
		    	for(String token : nextLine)
				{
					//Print all tokens
					System.out.println(token);
				}
		    }
		}
	    catch (Exception e) {
			e.printStackTrace();
		}
		finally	{
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Output:

1
Lokesh
Gupta
how2codex.com
enabled
2
Rakesh
Gupta
how2codex.com
enabled

..More output will appear here
源代码下载

学习愉快!

saigon has written 1440 articles

Leave a Reply