【问题标题】:Create CSV file with columns and values from HashMap使用 HashMap 中的列和值创建 CSV 文件
【发布时间】:2020-03-23 00:16:41
【问题描述】:

温柔点, 这是我第一次使用 Apache Commons CSV 1.7。

我正在创建一个服务来处理一些 CSV 输入, 从外部来源添加一些附加信息, 然后写出此 CSV 以供摄取到另一个系统中。

我将收集到的信息存储在一个列表中 HashMap<String, String> 用于最终输出 csv 的每一行。 Hashmap 包含<ColumnName, Value for column>

我在使用 CSVPrinter 将 HashMap 的值正确分配到行时遇到问题。 我可以将值连接成一个字符串,变量之间有逗号; 然而, 这只是将整个字符串插入第一列。

我无法定义或硬编码标头,因为它们是从配置文件中获取的,并且可能会根据使用该服务的项目而改变。

这是我的一些代码:

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();

}

感谢您的帮助。

【问题讨论】:

标签: java csv apache-commons-csv


【解决方案1】:

你实际上对你的技术有很多顾虑;

  1. 如何维护列顺序?
  2. 如何打印列名?
  3. 如何打印列值?

这是我的建议。

  1. 维护列顺序。 不要使用HashMap, 因为它是无序的。 反而, 使用具有“可预测迭代顺序”的LinkedHashMap (即维持秩序)。

  2. 打印列名。 列表中的每一行都包含键值形式的列名, 但您只打印列名作为输出的第一行。 解决方案是在遍历行之前打印列名。 从列表的第一个元素中获取它们。

  3. 打印列值。 “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();
}

【讨论】:

  • 感谢您的回答。我已经实现了与上面列出的内容略有不同的解决方案,纯粹是因为它比上面更适合我的特定问题 - 不是因为这是不正确的。标记为已接受,希望它可以帮助将来遇到类似问题的其他人。
【解决方案2】:
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);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多