【问题标题】:How to dynamically add CSV headers while more lines are added to the files如何在向文件中添加更多行时动态添加 CSV 标题
【发布时间】:2018-10-16 08:56:35
【问题描述】:

客户向我发送键值对列表,我需要将其附加到带有标题的 CSV 文件

lang=java                           lang, version, maven
version=1.8              ----->     java, 1.8, true
maven=true

另一个输入可能是:

lang=C#                           lang, version, maven
version=7.2              ----->   java, 1.8, true
maven=false                       C#, 7.2, false  

列表的数量可能有几百万,所以我需要将数据刷新到磁盘,不能全部保存在内存中。

由于键的列表是由客户端确定的,我想使用他的第一个输入来确定 CSV 文件的标题:

org.apache.commons.csv.CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(x, y, z ...)));

从那时起,只附加相关列的值:

csvPrinter.printRecord(xValue, yValue, zValue.....)

然而,它是一个顽皮的客户端,有时他会发送我从未见过的新密钥:

lang=java
meetMeAt=London
version=1.4
maven=false

此时我如何向 CSV 添加另一个标题?

首先将所有列表保存到一个csv文件没有标题,将所有标题累积在程序内存中,然后创建另一个包含所有标题的文件并将第一个记录复制到其中文件?合理吗?

【问题讨论】:

    标签: java csv apache-commons


    【解决方案1】:

    您提出的解决方案有一个问题需要我们解决:

    lang=java                           java, 1.8, true
    version=1.8              ----->     
    maven=true
    
    lang=java                           java, 1.8, true
    version=1.8              ----->           ???
    gradle=true
    

    你想如何表达它?添加另一列?当你不知道列标题时,你怎么知道需要添加另一列?

    如果你有能力读取两次输入,我建议你在第一次读取时收集标题,然后用已知的列标题和位置重新读取。

    如果您只需要读取一次输入,您的想法可以这样工作:

    • 将标题和相应的列位置保留在内存中
    • 写入不带标题的 CSV,但将所有数据放在正确的列中
      • 请注意,列数可能会增加,第一行的列数少于最后一行
    • 完成原始输入后,重新编写输出 CSV:
      • 将标题放在第一行
      • 向所有短于最终列数的行添加缺失列

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2020-04-23
      • 2020-09-05
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      相关资源
      最近更新 更多