如何使用 simpleflatmapper 在 csv 文件中写入 List<String[]>?
How to write a List<String[]> in a csv file with simpleflatmapper?
我必须使用库 simpleflatmapper 但我找不到简单地写入 csv 文件 的方法List<String[]>
与此 库 。我可以解析(没有空白行)并存入 List<String[]>
:
FileReader file = new FileReader("file.csv");
Iterator<String[]> parser = CsvParser.separator(',').quote('\"').iterator(file);
List<String[]> lines = new ArrayList<String[]>();
String[] line;
while(parser.hasNext()) {
line = parser.next();
if (line[0].length() != 0) {
lines.add(line);
}
}
FileWriter fw = new FileWriter("copy_file.csv");
........
但是我发现没有办法用List<String[]> lines
的数据写一个新的csv文件。我很确定这是可能的,但没有 足够的适当文档 。总之,我需要帮助!
来自官方文档首页:
CsvWriter.CsvWriterDSL<String[]> dsl = CsvWriter.from(String[].class)
.columns("a[0]", "a[1]", "a[2]")
.skipHeaders();
try (FileWriter fileWriter = new FileWriter(file)) {
CsvWriter<String[]> writer = dsl.to(fileWriter);
lines.forEach(CheckedConsumer.toConsumer(writer::append));
}
我假设每个 String[]
至少有三个元素 - columns("a[0]", "a[1]", "a[2]")
。否则,将出现 ArrayIndexOutOfBoundsException
。
在与库的作者讨论后,这种情况下的理想代码似乎是使用 CsvCellWriter
(当我们事先不知道要写入的列数,实际上如果我们没有 header) 而不是 CsvWriter
,因为 CsvWriter
需要提前知道要写入的 csv 文件的结构; 行是一个List<String[]>
Maven 依赖项:
<groupId>org.simpleflatmapper</groupId>
<artifactId>sfm-csv</artifactId>
<version>3.18.3</version>
import org.simpleflatmapper.csv.*;
import org.simpleflatmapper.csv.impl.writer.CsvCellWriter;
..........
FileWriter writer = new FileWriter("new_file.csv");
CsvCellWriter cellWriter = CsvCellWriter.DEFAULT_WRITER.separator(',').quote('"');
lines.forEach ( strs -> {
try {
if (strs.length > 0) {
cellWriter.writeValue(strs[0], writer);
for (int i = 1; i < strs.length; i++) {
cellWriter.nextCell(writer);
cellWriter.writeValue(strs[i], writer);
}
}
cellWriter.endOfRow(writer);
} catch (IOException e) {e.printStackTrace();}
} );
writer.close();
此代码允许以相同方式写入列表数据,因为我们可以选择分隔符、引号以及最终的其他选项。 此外这个库似乎可以方便快捷地解析 csv 文件。
我必须使用库 simpleflatmapper 但我找不到简单地写入 csv 文件 的方法List<String[]>
与此 库 。我可以解析(没有空白行)并存入 List<String[]>
:
FileReader file = new FileReader("file.csv");
Iterator<String[]> parser = CsvParser.separator(',').quote('\"').iterator(file);
List<String[]> lines = new ArrayList<String[]>();
String[] line;
while(parser.hasNext()) {
line = parser.next();
if (line[0].length() != 0) {
lines.add(line);
}
}
FileWriter fw = new FileWriter("copy_file.csv");
........
但是我发现没有办法用List<String[]> lines
的数据写一个新的csv文件。我很确定这是可能的,但没有 足够的适当文档 。总之,我需要帮助!
来自官方文档首页:
CsvWriter.CsvWriterDSL<String[]> dsl = CsvWriter.from(String[].class)
.columns("a[0]", "a[1]", "a[2]")
.skipHeaders();
try (FileWriter fileWriter = new FileWriter(file)) {
CsvWriter<String[]> writer = dsl.to(fileWriter);
lines.forEach(CheckedConsumer.toConsumer(writer::append));
}
我假设每个 String[]
至少有三个元素 - columns("a[0]", "a[1]", "a[2]")
。否则,将出现 ArrayIndexOutOfBoundsException
。
在与库的作者讨论后,这种情况下的理想代码似乎是使用 CsvCellWriter
(当我们事先不知道要写入的列数,实际上如果我们没有 header) 而不是 CsvWriter
,因为 CsvWriter
需要提前知道要写入的 csv 文件的结构; 行是一个List<String[]>
Maven 依赖项:
<groupId>org.simpleflatmapper</groupId>
<artifactId>sfm-csv</artifactId>
<version>3.18.3</version>
import org.simpleflatmapper.csv.*;
import org.simpleflatmapper.csv.impl.writer.CsvCellWriter;
..........
FileWriter writer = new FileWriter("new_file.csv");
CsvCellWriter cellWriter = CsvCellWriter.DEFAULT_WRITER.separator(',').quote('"');
lines.forEach ( strs -> {
try {
if (strs.length > 0) {
cellWriter.writeValue(strs[0], writer);
for (int i = 1; i < strs.length; i++) {
cellWriter.nextCell(writer);
cellWriter.writeValue(strs[i], writer);
}
}
cellWriter.endOfRow(writer);
} catch (IOException e) {e.printStackTrace();}
} );
writer.close();
此代码允许以相同方式写入列表数据,因为我们可以选择分隔符、引号以及最终的其他选项。 此外这个库似乎可以方便快捷地解析 csv 文件。