如何用Apache Commons CSV Parser按列读取CSV文件?
如何用Apache Commons CSV Parser按列读取CSV文件?
问题描述
我有如下格式的CSV文件:
Column A,Column B Cell 1,Cell 2 Cell 3,Cell 4
希望按列而非按行读取,期望输出结果为:
Column A , Cell 1 ,Cell 3 Column B , Cell 2, Cell 4
但查阅文档发现该工具似乎仅支持按行读取,请问是否有实现按列读取的方法?
解决方案
Apache Commons CSV本身确实是按行解析的,但可以通过先按行读取全量数据,再转换为按列组织的结构来实现需求。具体步骤和代码示例如下:
实现思路
- 读取CSV的表头和所有行记录
- 用二维列表存储每一列的所有数据(表头+单元格内容)
- 遍历二维列表,按列输出内容
示例代码
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.IOException; import java.util.ArrayList; import java.util.List; public class CsvColumnReader { public static void main(String[] args) throws IOException { // 配置CSV格式(默认逗号分隔、带表头,可根据实际调整) CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(); try (FileReader reader = new FileReader("your-csv-file.csv"); CSVParser parser = new CSVParser(reader, csvFormat)) { // 获取表头列表 List<String> headers = parser.getHeaderNames(); // 初始化列存储容器:每个子列表对应一列的数据 List<List<String>> columnData = new ArrayList<>(); for (int i = 0; i < headers.size(); i++) { columnData.add(new ArrayList<>()); // 先将表头加入对应列 columnData.get(i).add(headers.get(i)); } // 按行读取,将单元格数据分配到对应列 for (CSVRecord record : parser) { for (int i = 0; i < headers.size(); i++) { columnData.get(i).add(record.get(i)); } } // 按列输出结果 for (List<String> column : columnData) { System.out.println(String.join(" , ", column)); } } } }
说明
- 如果你的CSV有特殊格式(比如制表符分隔、带引号包裹等),只需调整
CSVFormat的配置即可,例如使用CSVFormat.TDF对应制表符分隔,CSVFormat.EXCEL对应Excel兼容格式。 - 这种方法的核心是将行数据转存为列结构,本质上还是基于Apache Commons CSV的行读取能力,属于轻量化的二次处理,性能上对于常规大小的CSV文件完全够用。
内容的提问来源于stack exchange,提问作者Riya
相关产品推荐
相关产品推荐

