如何将 ArrayList<Object> 写入 csv 文件
How to write ArrayList<Object> to a csv file
我有一个 ArrayList<Metadata>
,我想知道是否有一个 Java API 用于处理 CSV 文件,它有一个接受 ArrayList<> 作为参数的写入方法类似于 .Net 中的 LinqToCsv。据我所知,OpenCSV 可用,但 CsvWriter class 不接受集合。
我的元数据 Class 是
public class Metadata{
private String page;
private String document;
private String loan;
private String type;
}
ArrayList<Metadata> record = new ArrayList<Metadata>();
填充记录后,我想将每一行写入一个 csv 文件。
请提出建议。
肯定会有一大堆 API 可以为您做这件事,但为什么不自己为这样一个简单的案例做呢?它将为您节省依赖性,这对于任何规模的任何项目都是一件好事。
在 Metadata
中创建一个 toCsvRow()
方法,连接以逗号分隔的字符串。
public String toCsvRow() {
return Stream.of(page, document, loan, type)
.map(value -> value.replaceAll("\"", "\"\""))
.map(value -> Stream.of("\"", ",").anyMatch(value::contains) ? "\"" + value + "\"" : value)
.collect(Collectors.joining(","));
}
为每个 Metadata
个对象收集此方法的结果,每个对象用新行分隔。
String recordAsCsv = record.stream()
.map(Metadata::toCsvRow)
.collect(Collectors.joining(System.getProperty("line.separator")));
编辑
如果您没有幸运地拥有 Java 8 和 Stream API 供您使用,这几乎与使用传统列表一样简单。
public String toCsvRow() {
String csvRow = "";
for (String value : Arrays.asList(page, document, loan, type)) {
String processed = value;
if (value.contains("\"") || value.contains(",")) {
processed = "\"" + value.replaceAll("\"", "\"\"") + "\"";
}
csvRow += "," + processed;
}
return csvRow.substring(1);
}
通过使用 CSVWriter,您可以将 ArrayList
转换为数组,并将其传递给编写器。
csvWriter.writeNext(record.toArray(new String[record.size()]));
如果您有一个对象数组列表(在您的情况下是元数据),您将使用 BeanToCSV 而不是 CSVWriter。
您可以查看 BeanToCSVTest in the opencsv source code 中的示例,了解如何使用它。
我有一个 ArrayList<Metadata>
,我想知道是否有一个 Java API 用于处理 CSV 文件,它有一个接受 ArrayList<> 作为参数的写入方法类似于 .Net 中的 LinqToCsv。据我所知,OpenCSV 可用,但 CsvWriter class 不接受集合。
我的元数据 Class 是
public class Metadata{
private String page;
private String document;
private String loan;
private String type;
}
ArrayList<Metadata> record = new ArrayList<Metadata>();
填充记录后,我想将每一行写入一个 csv 文件。 请提出建议。
肯定会有一大堆 API 可以为您做这件事,但为什么不自己为这样一个简单的案例做呢?它将为您节省依赖性,这对于任何规模的任何项目都是一件好事。
在 Metadata
中创建一个 toCsvRow()
方法,连接以逗号分隔的字符串。
public String toCsvRow() {
return Stream.of(page, document, loan, type)
.map(value -> value.replaceAll("\"", "\"\""))
.map(value -> Stream.of("\"", ",").anyMatch(value::contains) ? "\"" + value + "\"" : value)
.collect(Collectors.joining(","));
}
为每个 Metadata
个对象收集此方法的结果,每个对象用新行分隔。
String recordAsCsv = record.stream()
.map(Metadata::toCsvRow)
.collect(Collectors.joining(System.getProperty("line.separator")));
编辑 如果您没有幸运地拥有 Java 8 和 Stream API 供您使用,这几乎与使用传统列表一样简单。
public String toCsvRow() {
String csvRow = "";
for (String value : Arrays.asList(page, document, loan, type)) {
String processed = value;
if (value.contains("\"") || value.contains(",")) {
processed = "\"" + value.replaceAll("\"", "\"\"") + "\"";
}
csvRow += "," + processed;
}
return csvRow.substring(1);
}
通过使用 CSVWriter,您可以将 ArrayList
转换为数组,并将其传递给编写器。
csvWriter.writeNext(record.toArray(new String[record.size()]));
如果您有一个对象数组列表(在您的情况下是元数据),您将使用 BeanToCSV 而不是 CSVWriter。
您可以查看 BeanToCSVTest in the opencsv source code 中的示例,了解如何使用它。