如何在向文件中添加更多行时动态添加CSV标头

时间:2018-05-06 11:30:06

标签: java csv apache-commons

客户正在向我发送我需要附加到带有标题的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文件不带标题,如何累积程序存储器中的所有标题,然后创建包含所有标题的另一个文件并将第一个文件复制到其中文件?这是合理的吗?

1 个答案:

答案 0 :(得分:0)

您提出的解决方案存在我们需要解决的问题:

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

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

您想如何表示?添加另一列?当您不知道列标题时,您如何知道需要添加其他列?

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

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

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