我有 3 个 csv 文件。每个文件包含 10 列,但其中只有 1 列具有不同的值。
如图所示,每种语言仅目的地名称不同。
如何将列放在现有列之间以及如何更改它们的标题(DEST_NAME_DISPLAY --> DEST_NAME_EN)?
到目前为止,除了使用 Super csv
读取 csv 文件之外,我对 csv 操作几乎没有经验我目前所知道的例子
public List<City> readWithCsvMapReader(String file, String source) throws IOException, AuthenticationException, RepositoryException {
ICsvMapReader mapReader = null;
FileInputStream stream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(stream, ENCODING);
try {
mapReader = new CsvMapReader(reader, PREFERENCE);
final String[] header = mapReader.getHeader(true);
final CellProcessor[] processors = getProcessors();
Map<String, Object> locationMap;
while ((locationMap = mapReader.read(header, processors)) != null) {
/*do some logic*/
}
} finally {
if (mapReader != null) {
mapReader.close();
}
}
}
public CellProcessor[] getProcessors() {
final CellProcessor[] processors = new CellProcessor[]{
new NotNull(), // COU_ID
new NotNull(), // COU_NAME
new NotNull(), // DEST_ID
new NotNull(), // DEST_NAME_DISPLAY
new Optional(), //DEST_PARENT_ID
new NotNull(), // DEST_STATION_COUNT
new NotNull(), // DEST_CHILD_DEST_COUNT
new NotNull(), // DEST_FLAG_APT
new NotNull(), // DEST_FLAG_WIN
new NotNull(), // DEST_FLAG_DEL
};
return processors;
}
打开所有三个 CSV 文件。
在每次迭代中,从每个文件中读取一行,从一个文件中获取所有单元格值,并从其他两个文件中获取不同单元格的值。合并到包含所有所需数据的新行,将此行写入输出 CSV。
关闭所有文件。处理异常状态(每个文件中的行数不同、每个文件当前行的 ID 不同,...)。
您可以使用 CsvCruncher 来执行此操作。您还可以将它用作库 - 它可以从 Maven Central 获取。在内部,它将 CSV 文件导入到 HSQLDB,然后针对创建的表运行提供的 SQL。
使用它的方法如下:
val option = Options()
val import1 = options.newImportArgument().apply {
currentExport.path = Path.of("file1.csv")
currentExport.format = CSV
}
val import2 = options.newImportArgument().apply { ... }
val export = options.newExportArgument().apply {
path = Path.of("output.csv")
sqlQuery = """
SELECT ...
FROM file1
LEFT JOIN file2 ON file1.COU_ID = file2.COU_ID
LEFT JOIN file3 ON file1.COU_ID = file3.COU_ID
"""
}
Cruncher(options).crunch()
然后该文件将出现在
output.csv
下。
当然,您可以使用任何 SQL 方式加入您喜欢的文件 -
NATURAL JOIN
等,并对它们进行排序、聚合等。支持 SQL-92 到 SQL:2023。