java - 如何在向文件中添加更多行时动态添加 CSV 标题
问题描述
客户向我发送了我需要附加到带有 headers 的 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 文件中,将所有标题累积在程序内存中,然后创建另一个包含所有标题的文件并将第一个文件中的记录复制到其中?合理吗?
解决方案
您提出的解决方案有一个问题需要我们解决:
lang=java java, 1.8, true
version=1.8 ----->
maven=true
lang=java java, 1.8, true
version=1.8 -----> ???
gradle=true
你想如何表达它?添加另一列?当您不知道列标题时,您如何知道需要添加另一列?
如果您有能力读取两次输入,我建议您在第一次读取时收集标题,然后使用已知的列标题和位置重新读取。
如果您只需要读取一次输入,您的想法可以这样工作:
- 将标题和相应的列位置保留在内存中
- 编写不带标题的 CSV,但将所有数据放在正确的列中
- 请注意,列数可能会增加,第一行的列数少于最后一行
- 完成原始输入后,重新编写输出 CSV:
- 将标题放在第一行
- 将缺失的列添加到比最终列数短的所有行
推荐阅读
- python-3.x - 在 Python 中使用 int() 将类型转换为整数
- python - Python 正则表达式负向后看,包括行首
- javascript - 如何使 Ctrl-f 始终在 Tabulator Plus 有关分页和高度的问题中工作?
- python-3.x - 执行我的 setuptools console_script 时出现 ModuleNotFoundError
- regex - 正则表达式阻止字符串中超过 3 个数字
- mongodb - 如何创建一个模式以在 mongoDB 上创建一个地方使用 moongose
- java - 无法在 macOS Big Sur 上安装 protobuf 编译器
- outlook - 支持清单中的许多子域
- c# - ASP.NET Core 捕获 HTTP 状态码 413 Payload Too Large / Request Entity Too Large
- python - 使用 Gensim 的短语构建二元组时如何防止包含某些单词?