JAVA解析CSV

利用opencsv.jar解析,请自行下载。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;


public class CsvTest {
public static void main(String[] args) {
try {
CSVReader reader = new CSVReader(new FileReader("D://data.csv"));
List<String[]> list = reader.readAll();
for(int i=0;i<list.size();i++){
String[] strs = list.get(i);
for(int j=0;j<strs.length;j++){
System.out.print(strs[j]+"|");
}
System.out.println();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

### Java解析CSV文件的方法 #### 手动解析CSV文件 可以使用`BufferedReader`读取CSV文件并逐行处理数据。这种方法虽然灵活,但在面对复杂的CSV结构(如字段嵌套逗号或换行符)时容易出现问题。 ```java import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; public class ManualCSVParser { public static void main(String[] args) throws Exception { ArrayList<String[]> data = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader("test.csv"))) { String line; while ((line = br.readLine()) != null) { String[] values = line.split(","); // 假设简单分隔符为逗号 data.add(values); } } catch (Exception e) { System.out.println(e.getMessage()); } for (String[] row : data) { System.out.println(row[0] + ", " + row[1]); } } } ``` 此方法适用于简单的CSV文件[^5]。 --- #### 使用OpenCSV解析CSV文件 OpenCSV是一个功能强大的第三方库,能够轻松解析复杂格式的CSV文件。以下是其基本用法: ##### Maven依赖配置 在项目中引入OpenCSV库前,需先添加Maven依赖项: ```xml <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.5.2</version> </dependency> ``` ##### OpenCSV基础示例 通过`CSVReader`类读取CSV文件的内容: ```java import com.opencsv.CSVReader; import java.io.FileReader; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; public class OpenCSVExample { public static void main(String[] args) { try (CSVReader reader = new CSVReader(new FileReader("test.csv", Charset.forName("GBK")))) { // 设置编码方式 List<String[]> records = reader.readAll(); for (String[] record : records) { System.out.println(record[0] + ", " + record[1]); // 输出每列的数据 } } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码展示了如何利用OpenCSV来高效解析带有特定字符集的CSV文件[^2]。 --- #### 将CSV文件映射到实体类 如果希望将CSV中的每一行转换成对应的Java对象,则可以通过自定义工具实现这一需求。下面展示了一个基于OpenCSV的例子: ```java import com.opencsv.bean.ColumnPositionMappingStrategy; import com.opencsv.bean.CsvToBeanBuilder; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; class User { private String name; private int age; @Override public String toString() { return "User{name='" + name + "', age=" + age + "}"; } } public class CsvToObjectMapper { public static void main(String[] args) throws Exception { Reader reader = Files.newBufferedReader(Paths.get("users.csv")); ColumnPositionMappingStrategy<User> strategy = new ColumnPositionMappingStrategy<>(); strategy.setType(User.class); // 映射目标类型 String[] columns = {"name", "age"}; // 定义属性顺序 strategy.setColumnMapping(columns); List<User> users = new CsvToBeanBuilder(reader) .withType(User.class) .withMappingStrategy(strategy) .build() .parse(); users.forEach(System.out::println); } } ``` 该片段说明了如何借助OpenCSVCSV记录转化为指定类型的实例集合[^4]。 --- #### 创建通用的CSV工具类 为了提高可重用性和简化操作流程,建议封装一个专门用于处理CSV文件的实用程序类。如下所示的是一个典型的例子: ```java import com.opencsv.CSVWriter; import java.io.FileWriter; import java.io.Writer; import java.util.Arrays; import java.util.List; public class CsvUtils { /** * 写入CSV文件 */ public static void writeCsv(List<List<String>> rows, String filePath) { try (Writer writer = new FileWriter(filePath); CSVWriter csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, '\\', "\n")) { // 自定义写入参数 for (List<String> rowData : rows) { csvWriter.writeNext(rowData.toArray(new String[rowData.size()])); } } catch (Exception ex) { throw new RuntimeException(ex); } } public static void main(String[] args) { List<List<String>> data = Arrays.asList( Arrays.asList("Name", "Age"), Arrays.asList("Alice", "30"), Arrays.asList("Bob", "25") ); writeCsv(data, "output.csv"); } } ``` 这段代码实现了向任意路径下的新文件追加内容的功能,并支持多种定制选项[^3]。 --- ### 总结 对于初学者来说,手动编写逻辑可能更直观;然而当遇到实际生产环境或者较为庞大的数据量时,采用成熟的开源框架会更加稳妥可靠。其中OpenCSV因其易用性成为众多开发者首选之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值