Java 将多个CSV映射到单个POJO

Java 将多个CSV映射到单个POJO,java,csv,Java,Csv,我有许多不同列标题的CSV文件。目前我正在读取这些csv文件,并根据它们的列标题将它们映射到不同的POJO类。因此,一些CSV文件有大约100个列标题,这使得创建POJO类非常困难 那么,是否有任何技术可以使用单个pojo,以便在读取这些csv文件时可以映射到单个pojo类,或者我应该逐行读取csv文件并进行相应的解析,或者我应该在运行时创建pojo(javaassist)?如果我正确理解您的问题,您可以使用来处理此问题并在映射中获取数据: //First create a configurat

我有许多不同列标题的CSV文件。目前我正在读取这些csv文件,并根据它们的列标题将它们映射到不同的POJO类。因此,一些CSV文件有大约100个列标题,这使得创建POJO类非常困难


那么,是否有任何技术可以使用单个pojo,以便在读取这些csv文件时可以映射到单个pojo类,或者我应该逐行读取csv文件并进行相应的解析,或者我应该在运行时创建pojo(javaassist)?

如果我正确理解您的问题,您可以使用来处理此问题并在映射中获取数据:

//First create a configuration object - there are many options 
//available and the tutorial has a lot of examples
CsvParserSettings settings = new CsvParserSettings();
settings.setHeaderExtractionEnabled(true);

CsvParser parser = new CsvParser(settings);
parser.beginParsing(new File("/path/to/your.csv"));

// you can also apply some transformations:
// NULL year should become 0000
parser.getRecordMetadata().setDefaultValueOfColumns("0000", "Year");

// decimal separator in prices will be replaced by comma
parser.getRecordMetadata().convertFields(Conversions.replace("\\.00", ",00")).set("Price");

Record record;
while ((record = parser.parseNextRecord()) != null) {
     Map<String, String> map = record.toFieldMap(/*you can pass a list of column names of interest here*/);
     //for performance, you can also reuse the map and call record.fillFieldMap(map);
}
希望这有帮助


免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)

如果我正确理解您的问题,您可以使用来处理此问题并在地图中获取数据:

//First create a configuration object - there are many options 
//available and the tutorial has a lot of examples
CsvParserSettings settings = new CsvParserSettings();
settings.setHeaderExtractionEnabled(true);

CsvParser parser = new CsvParser(settings);
parser.beginParsing(new File("/path/to/your.csv"));

// you can also apply some transformations:
// NULL year should become 0000
parser.getRecordMetadata().setDefaultValueOfColumns("0000", "Year");

// decimal separator in prices will be replaced by comma
parser.getRecordMetadata().convertFields(Conversions.replace("\\.00", ",00")).set("Price");

Record record;
while ((record = parser.parseNextRecord()) != null) {
     Map<String, String> map = record.toFieldMap(/*you can pass a list of column names of interest here*/);
     //for performance, you can also reuse the map and call record.fillFieldMap(map);
}
希望这有帮助


免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)

对我来说,在这种情况下创建POJO类不是一个好主意。因为列数和文件数都不是常数。 因此,最好使用一些更动态的东西,而不必为了支持更多的列或文件而在很大程度上更改代码

对于给定的csv文件,我需要一个
列表(或
映射
)的
映射
列表。
其中,每个
映射
表示csv文件中的一行,列名称为


您可以轻松地将其扩展到多个csv文件。

对我来说,在这种情况下创建POJO类不是一个好主意。因为列数和文件数都不是常数。 因此,最好使用一些更动态的东西,而不必为了支持更多的列或文件而在很大程度上更改代码

对于给定的csv文件,我需要一个
列表(或
映射
)的
映射
列表。
其中,每个
映射
表示csv文件中的一行,列名称为


您可以轻松地将其扩展到多个csv文件。

您是否考虑过使用映射而不是POJO?您是否考虑过使用映射而不是POJO?
AmountBean amountBean = (AmountBean) row.get(AmountBean.class);
QuantityBean quantityBean = (QuantityBean) row.get(QuantityBean.class);
...

//perform something with the instances parsed in a row.