Java读取csv文件

本文介绍了一个使用com.Ostermiller.util库实现的CSV文件解析工具类。该工具类提供了读取CSV文件标题、按行读取数据等功能。
在http://hjxia.iteye.com上看到这篇文章,试了试,还好用,记录了下来
首先在http://ostermiller.org/utils/download.html 上下载com.Ostermiller.util cvs的jar包.
有了这个jar包就可以写个工具类,专门控制csv文件的读取操作.
具体代码如下:
package com.spr.csv;   

import java.io.IOException;
import java.io.InputStream;

import com.Ostermiller.util.ExcelCSVParser;
import com.Ostermiller.util.LabeledCSVParser;

public class CsvFileParser{

private LabeledCSVParser csvParser;//csvParser

private int currLineNum = -1;//The current line number for reading.

private String[] currLine = null;//The data of current line.


/*
* Param: in InputStream
* throws IOException
*/

public CsvFileParser(InputStream in) throws IOException {

csvParser = new LabeledCSVParser(new ExcelCSVParser(in));
currLineNum = csvParser.getLastLineNumber();
}

/*
* Get the titles of csv file.
*
* return String[]
*/
public String[] getTitles() throws IOException {
return csvParser.getLabels();
}


/*
* Checkout whether it has more data.
*
* @return ture: has data,false nodata.
*/
public boolean hasMore() throws IOException {
currLine = csvParser.getLine();
currLineNum = csvParser.getLastLineNumber();
if (null == currLine)
return false;
return true;
}

/*
* Get the data of filed by field name.
* param:String filedName
*
* @return:String
*/
public String getByFieldName(String fieldName) {

return csvParser.getValueByLabel(fieldName);
}

/*
* Close the parser.
*
*
*/
public void close() throws IOException {
csvParser.close();

}

/*
* Read the current line.Return the data of current line.
*
* @return String[]
*/
public String[] readLine() throws IOException {
currLine = csvParser.getLine();

currLineNum = csvParser.getLastLineNumber();

return currLine;
}

/*
* Get current line number.
*
* @return int
*/
public int getCurrLineNum(){
return currLineNum;

}

/*
* Get the data of the current line.
*
* @return String[]
*/
public String[] getCurrLine() {
return currLine;
}

}
<think> 首先,用户的问题是:“我想查找Java读取CSV文件的方法 请问Java读取CSV文件的实现方法”。这明确表示用户想知道如何在Java读取CSV文件的方法。 现在,回顾系统级指令: - 所有行内数学表达式必须使用$...$格式(但这里可能不涉及数学,所以忽略)。 - 独立公式使用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(需确保)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 提供的引用: - 引用[1]:介绍了CSV文件的基本结构、使用BufferedReader和第三方库(Apache Commons CSV, OpenCSV读取CSV的方法,以及处理注意事项。 - 引用[2]:讨论了多种方式,包括Apache Commons CSVJava 8 API,以及BufferedReader手动解析。 - 引用[3]:展示了一个Java工具类代码,使用HPoiUtils(可能是自定义或第三方库)读取CSV并转换为对象。 用户上一次的问题和我的回答:根据上下文,用户之前可能问过类似问题,但在这个对话中,这是第一个查询,所以没有历史。我需要基于当前引用和一般知识回答。 结构化回答: - 回答应该清晰、逐步解释如何实现Java读取CSV文件。 - 覆盖主要方法:手动解析(使用BufferedReader)、使用第三方库(如Apache Commons CSV)、以及Java 8+的流API。 - 包括代码示例。 - 添加注意事项,如编码问题、分隔符处理等。 - 末尾生成相关问题。 确保使用中文。 步骤: 1. **引言**:简要介绍CSV文件Java读取的重要性。 2. **主要方法**: - 方法1:使用BufferedReader手动解析。 - 解释步骤。 - 提供代码示例。 - 提及优缺点(如简单但易出错)。 - 方法2:使用第三方库(如Apache Commons CSV)。 - 解释为什么推荐(更健壮)。 - 提供依赖添加和代码示例。 - 提到其他库如OpenCSV。 - 方法3:使用Java 8+的流API。 - 简要介绍。 3. **注意事项**:讨论编码(如UTF-8)、分隔符、引号处理等。 4. **总结**:推荐最佳实践。 5. **相关问题**:生成2-3个相关问题。 添加引用标识:在引用到内容的部分末尾添加[^1], [^2], [^3]。例如,如果提到引用中的点,就在那里加。 在回答中,我需要自然地融入引用。引用[1]提到CSV基础、方法、注意事项;引用[2]提到多种方式和编码;引用[3]提供代码示例。所以,我会在相关地方引用。 代码示例:使用代码块,如示例中所示。 最终回答结构: - 开头介绍。 - 分步骤解释方法。 - 代码块。 - 注意事项。 - 总结。 - 相关问题。 </think>以下是针对Java读取CSV文件实现方法的详细解答。我将基于提供的引用内容(如使用BufferedReader、第三方库等),并确保回答结构清晰、真实可靠。CSV文件是一种逗号分隔值格式,常用于数据交换;读取时需注意编码(如UTF-8以避免乱码)、分隔符处理、引号转义等问题[^2]。下面我将逐步介绍三种主流方法:手动解析(基础方式)、使用第三方库(推荐方式),以及Java 8+的流API方式。每种方法都附有代码示例和说明。 ### 1. **使用BufferedReader手动解析(基础方法)** 这种方法简单直接,不需要额外依赖,适合小型CSV文件。但缺点是需要手动处理分隔符、引号等,容易出错(如逗号在引号内被误分割)[^1][^2]。 **步骤:** 1. 使用`BufferedReader`逐行读取文件。 2. 将每行按逗号分割为数组(需考虑引号内的逗号)。 3. 处理数据(如转换为对象或列表)。 **代码示例:** ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ReadCSVBasic { public static void main(String[] args) { String csvFile = "data.csv"; // CSV文件路径 List<String[]> data = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { String line; while ((line = br.readLine()) != null) { // 简单分割逗号(注意:此方法不处理引号内的逗号) String[] values = line.split(","); data.add(values); System.out.println(String.join(" | ", values)); // 打印每行数据 } } catch (IOException e) { e.printStackTrace(); } } } ``` **优点与缺点:** - 优点:无需第三方库,代码简单。 - 缺点:无法处理复杂情况(如引号或换行符),需额外逻辑增强健壮性[^1]。 ### 2. **使用第三方库(推荐方法)** 第三方库如Apache Commons CSV或OpenCSV提供更健壮的解析功能,能自动处理引号、换行符等,减少错误[^1][^2]。推荐用于生产环境。 **步骤(以Apache Commons CSV为例):** 1. 添加依赖(Maven项目): ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.10.0</version> <!-- 使用最新版本 --> </dependency> ``` 2. 使用`CSVParser`解析文件,支持表头映射。 **代码示例:** ```java import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import java.io.FileReader; import java.io.Reader; import java.util.List; public class ReadCSVWithLibrary { public static void main(String[] args) { String csvFile = "data.csv"; try (Reader reader = new FileReader(csvFile)) { CSVParser parser = CSVFormat.DEFAULT .withFirstRecordAsHeader() // 使用第一行作为表头 .parse(reader); // 获取表头 System.out.println("表头: " + parser.getHeaderNames()); // 遍历每条记录 for (CSVRecord record : parser) { String id = record.get("id"); // 根据表头获取值 String name = record.get("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (Exception e) { e.printStackTrace(); } } } ``` **优点与缺点:** - 优点:自动处理复杂CSV结构,支持数据类型转换。 - 缺点:需引入外部依赖[^1]。 - 其他库:OpenCSV类似,提供类似功能[^1]。 ### 3. **使用Java 8+流API(现代方法)** Java 8及以上版本可使用`java.nio.file`和流API读取CSV,结合`BufferedReader`实现高效处理[^2]。适合流式数据操作。 **步骤:** 1. 使用`Files.lines()`读取文件行流。 2. 将每行分割并处理。 **代码示例:** ```java import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; public class ReadCSVWithStream { public static void main(String[] args) { String csvFile = "data.csv"; try { List<String[]> data = Files.lines(Paths.get(csvFile)) .map(line -> line.split(",")) // 简单分割 .collect(Collectors.toList()); // 输出数据 data.forEach(arr -> System.out.println(String.join(" - ", arr))); } catch (IOException e) { e.printStackTrace(); } } } ``` **优点与缺点:** - 优点:简洁高效,利用流式处理减少内存占用。 - 缺点:仍需手动处理引号等细节,不如第三方库健壮[^2]。 ### 注意事项总结 - **编码问题**:CSV文件必须使用UTF-8编码,否则会出现乱码;在读取时指定编码(如`new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)`)[^2]。 - **数据处理**:处理引号(如`"value, with comma"`)时,第三方库更可靠;表头映射可简化数据访问[^1]。 - **性能建议**:大型文件优先使用第三方库或流API,以避免内存溢出。 - **最佳实践**:推荐Apache Commons CSV库,它平衡了灵活性和易用性[^1][^2]。 ### 相关问题 为了帮助你深入学习,以下是几个相关问题: 1. 如何处理CSV文件中的引号和特殊字符? 2. Java读取CSV时如何优化大文件性能? 3. 如何将CSV数据转换为Java对象(如POJO)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值