You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:01:12