使用 HashMap 中的列和值创建 CSV 文件
Create CSV file with columns and values from HashMap
温柔一点,
这是我第一次使用 Apache Commons CSV 1.7。
我正在创建一个服务来处理一些 CSV 输入,
从外部来源添加一些额外的信息,
然后写出此 CSV 以引入另一个系统。
我将收集到的信息存储到列表中
HashMap<String, String>
对于最终输出 csv 的每一行。
Hashmap 包含 <ColumnName, Value for column>
.
我在使用 CSVPrinter 将 HashMap 的值正确分配到行中时遇到问题。
我可以将值连接成一个字符串,变量之间用逗号分隔;
然而,
这只是将整个字符串插入第一列。
我无法定义或硬编码 headers,因为它们是从配置文件中获取的,并且可能会根据使用该服务的项目而改变。
这是我的一些代码:
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get(OUTPUT + "/" + project + "/" + project + ".csv"));)
{
CSVPrinter csvPrinter = new CSVPrinter(writer,
CSVFormat.RFC4180.withFirstRecordAsHeader());
csvPrinter.printRecord(columnList);
for (HashMap<String, String> row : rowCollection)
{
//Need to map __record__ to column -> row.key, value -> row.value for whole map.
csvPrinter.printrecord(__record__);
}
csvPrinter.flush();
}
感谢您的帮助。
for (HashMap<String,String> row : rowCollection) {
Object[] record = new Object[row.size()];
for (int i = 0; i < columnList.size(); i++) {
record[i] = row.get(columnList.get(i));
}
csvPrinter.printRecord(record);
}
您实际上对自己的技术有很多顾虑;
- 如何维护列顺序?
- 如何打印列名?
- 如何打印列值?
这是我的建议。
保持列顺序。
不要使用 HashMap
,
因为它是无序的。
反而,
使用具有 "predictable iteration order" 的 LinkedHashMap
(即维持秩序)。
打印列名。
列表中的每一行都包含键值形式的列名,
但是您只将列名打印为输出的第一行。
解决方案是在遍历行之前打印列名。
从列表的第一个元素中获取它们。
打印列值。
"billal GHILAS" 答案演示了一种打印每行值的方法。
这是一些代码:
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get(OUTPUT + "/" + project + "/" + project + ".csv"));)
{
CSVPrinter csvPrinter = new CSVPrinter(writer,
CSVFormat.RFC4180.withFirstRecordAsHeader());
// This assumes that the rowCollection will never be empty.
// An anonymous scope block just to limit the scope of the variable names.
{
HashMap<String, String> firstRow = rowCollection.get(0);
int valueIndex = 0;
String[] valueArray = new String[firstRow.size()];
for (String currentValue : firstRow.values())
{
valueArray[valueIndex++] = currentValue;
}
csvPrinter.printrecord(valueArray);
}
for (HashMap<String, String> row : rowCollection)
{
int valueIndex = 0;
String[] valueArray = new String[row.size()];
for (String currentValue : row.values())
{
valueArray[valueIndex++] = currentValue;
}
csvPrinter.printrecord(valueArray);
}
csvPrinter.flush();
}
温柔一点, 这是我第一次使用 Apache Commons CSV 1.7。
我正在创建一个服务来处理一些 CSV 输入, 从外部来源添加一些额外的信息, 然后写出此 CSV 以引入另一个系统。
我将收集到的信息存储到列表中
HashMap<String, String>
对于最终输出 csv 的每一行。
Hashmap 包含 <ColumnName, Value for column>
.
我在使用 CSVPrinter 将 HashMap 的值正确分配到行中时遇到问题。 我可以将值连接成一个字符串,变量之间用逗号分隔; 然而, 这只是将整个字符串插入第一列。
我无法定义或硬编码 headers,因为它们是从配置文件中获取的,并且可能会根据使用该服务的项目而改变。
这是我的一些代码:
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get(OUTPUT + "/" + project + "/" + project + ".csv"));)
{
CSVPrinter csvPrinter = new CSVPrinter(writer,
CSVFormat.RFC4180.withFirstRecordAsHeader());
csvPrinter.printRecord(columnList);
for (HashMap<String, String> row : rowCollection)
{
//Need to map __record__ to column -> row.key, value -> row.value for whole map.
csvPrinter.printrecord(__record__);
}
csvPrinter.flush();
}
感谢您的帮助。
for (HashMap<String,String> row : rowCollection) {
Object[] record = new Object[row.size()];
for (int i = 0; i < columnList.size(); i++) {
record[i] = row.get(columnList.get(i));
}
csvPrinter.printRecord(record);
}
您实际上对自己的技术有很多顾虑;
- 如何维护列顺序?
- 如何打印列名?
- 如何打印列值?
这是我的建议。
保持列顺序。 不要使用
HashMap
, 因为它是无序的。 反而, 使用具有 "predictable iteration order" 的LinkedHashMap
(即维持秩序)。打印列名。 列表中的每一行都包含键值形式的列名, 但是您只将列名打印为输出的第一行。 解决方案是在遍历行之前打印列名。 从列表的第一个元素中获取它们。
打印列值。 "billal GHILAS" 答案演示了一种打印每行值的方法。
这是一些代码:
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get(OUTPUT + "/" + project + "/" + project + ".csv"));)
{
CSVPrinter csvPrinter = new CSVPrinter(writer,
CSVFormat.RFC4180.withFirstRecordAsHeader());
// This assumes that the rowCollection will never be empty.
// An anonymous scope block just to limit the scope of the variable names.
{
HashMap<String, String> firstRow = rowCollection.get(0);
int valueIndex = 0;
String[] valueArray = new String[firstRow.size()];
for (String currentValue : firstRow.values())
{
valueArray[valueIndex++] = currentValue;
}
csvPrinter.printrecord(valueArray);
}
for (HashMap<String, String> row : rowCollection)
{
int valueIndex = 0;
String[] valueArray = new String[row.size()];
for (String currentValue : row.values())
{
valueArray[valueIndex++] = currentValue;
}
csvPrinter.printrecord(valueArray);
}
csvPrinter.flush();
}