如何使用Super CSV按列值生成多个CSV文件?
用Super CSV按列值拆分生成多个CSV文件的实现方法
当然可以实现,Super CSV本身没有提供直接的拆分工具,但通过读取源文件+按列值分组+分别写入的流程就能完成需求。以下是具体的实现步骤和代码示例:
核心思路
- 读取源CSV文件,逐行解析数据
- 以目标列(比如示例中的
city)的值为键,对数据进行分组 - 为每个分组创建独立的Super CSV Writer,先写入表头,再写入对应行数据
- 最后统一关闭所有Writer资源,避免内存泄漏
代码实现(Java)
首先确保引入Super CSV依赖(以Maven为例):
<dependency> <groupId>org.supercsv</groupId> <artifactId>super-csv</artifactId> <version>2.4.0</version> </dependency>
完整实现代码:
import org.supercsv.io.CsvBeanReader; import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.ICsvBeanReader; import org.supercsv.io.ICsvBeanWriter; import org.supercsv.prefs.CsvPreference; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; // 映射CSV行数据的实体类 class Person { private String Name; private Integer age; private String city; public Person() {} // Getter & Setter public String getName() { return Name; } public void setName(String name) { Name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } } public class CsvCitySplitter { private static final String[] CSV_HEADER = {"Name", "age", "city"}; private static final CsvPreference CSV_SETTINGS = CsvPreference.STANDARD_PREFERENCE; public static void main(String[] args) throws IOException { // 存储每个城市对应的Writer实例 Map<String, ICsvBeanWriter> cityWriters = new HashMap<>(); try (ICsvBeanReader csvReader = new CsvBeanReader(new FileReader("source.csv"), CSV_SETTINGS)) { // 跳过源文件表头 csvReader.getHeader(true); Person currentPerson; // 逐行读取并处理数据 while ((currentPerson = csvReader.read(Person.class, CSV_HEADER)) != null) { String city = currentPerson.getCity().trim(); ICsvBeanWriter cityWriter = cityWriters.get(city); // 首次处理该城市时,创建Writer并写入表头 if (cityWriter == null) { cityWriter = new CsvBeanWriter(new FileWriter(city + ".csv"), CSV_SETTINGS); cityWriter.writeHeader(CSV_HEADER); cityWriters.put(city, cityWriter); } // 将当前行写入对应城市的CSV文件 cityWriter.write(currentPerson, CSV_HEADER); } } finally { // 关闭所有Writer释放资源 for (ICsvBeanWriter writer : cityWriters.values()) { if (writer != null) { writer.close(); } } } } }
关键说明
- 用
Person类映射CSV行数据,简化读写操作;如果字段名和表头不一致,可以搭配CellProcessor做字段映射 - 用
HashMap缓存每个城市的Writer,避免重复创建文件和写入表头 - 对城市名做
trim()处理,避免因空格导致的分组错误(比如示例中" Chennai"和"Chennai"会被识别为同一组) - 使用try-with-resources语法管理Reader资源,确保自动关闭;Writer资源在finally块中统一关闭,保证所有数据都被写入
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

