【问题标题】:Merge multiple csv files with difference header tile in Objective C在Objective C中合并具有不同标题图块的多个csv文件
【发布时间】:2018-08-06 09:11:00
【问题描述】:

我有多个带有不同标题图块的 csv 文件,我想合并所有这些文件并保留组合标题标题。 我想我可以将 csv 覆盖到数组中,然后比较所有文件中的标题图块,然后合并 csv 文件。然而,似乎它得到了巨大的处理时间,因为那里有很多循环。如果有任何快速的解决方案,您能帮忙吗?

例子:

file1.csv

No,Series,Product,A,B,C,D,E
1,  AAA,  XX,     a1,b1,c1,d1,e1

file2.csv

No,Series,Product,A,C,D,B,E,F,G
1,  AAB,  XX,     a1,c1,d1,b1,e1,f1,g1

file3.csv

No,Series,Product,A,A1,A2,C,D,B1,B,E
1,  AAC,  XX,     a1,a11,a21,c1,d1,b11,b1,e1

我预期的合并文件是: 合并.csv

No,Series,Product,A,A1,A2,B,B1,C,D,E,F,G
1,  AAA,  XX,     a1,0,0,b1,0,c1,d1
1,  AAB,  XX,     a1,0,0,b1,0,c1,d1,e1,f1,g1
1,  AAC,  XX,     a1,a11,a21,b1,b11,c1,d1,e1

“列中不存在的数据将显示为“0”或“NA”等

【问题讨论】:

  • 我会创建一个具有自定义属性的对象,如果它不存在,它将保存值“0”或“NA”。解析各种 csv 文件并创建您的对象,然后从中创建最终的 csv。你知道所有的“标题类别”吗?
  • 编辑你的问题并展示你的代码,或者至少是一个足够的大纲。人们无法在不知情的情况下对您的算法提出改进建议。
  • 我目前的想法我觉得不太好。 (1)将csv转换为数组(2)将数组的每个字符串转换为NSDictionary(3)一一比较然后创建新字符串添加NSMutableString然后导出到csv。 Normaly 我必须合并许多具有大行(超过 10K 行)的文件,这样非常慢。
  • A、A1 等列的顺序重要吗?还是只是按字母顺序排序?
  • 实际上没有订单大师。但是我想要的是行值匹配(组合瓷砖)

标签: objective-c macos merge nsarray export-to-csv


【解决方案1】:

从您的评论看来,您似乎没有代码,但您认为您的草图会很慢,听起来您正在过早地优化 - 对您的算法进行编码,测试它,如果它很慢,请使用 Instruments 来查看时间在哪里花了,然后看优化。

说了一些建议:

  • 您需要确定是否支持通用 CSV 文件,其中字段值可能包含逗号、换行符或双引号;或简单的 CSV 文件,其中没有这些字符出现在字段中。请参阅Common Format and MIME Type for Comma-Separated Values (CSV) Files 的第 2 节,您需要解析什么以支持通用 CSV 文件,并记住您需要使用相同的约定输出值。如果您坚持使用简单的 CSV 文件,那么 NSStringcomponentsSeparatedByString:NSArraycomponentsJoinedByString: 可能就是您需要分别解析和输出的全部内容。

  • 考虑首先遍历您的文件,仅读取标题行,解析它们,并生成合并的标题列表。您需要保留标题的顺序,以便将它们与数据行配对,因此数组是您在这里选择的容器。您可以选择在合并过程中使用集合,但最终合并的标题列表也应该是一个数组,按照您希望它们出现在合并文件中的顺序排列。您可以在下面的字典方法中直接使用这些标头数组。

  • 在大纲中使用字典是一种方法。在这种情况下,请查看NSDictionarydictionaryWithObjects:forKeys: 以从解析的标题和记录中构建字典。要输出字典,请查看 objectsForKeys:notFoundMarker: 并使用合并的标题列表。这支持缺少键,您提供要插入的值。对于标准 CSV,缺失值为空(即文本中的两个相邻逗号),但您可以按照您的建议使用 NA0

  • 您可以依次处理每个文件,一次一行:读取、解析、制作字典、从字典中取回一个值数组以及适当位置的缺失值、组合、写入。您永远不需要在内存中保存完整的文件。

如果在使用字典实现代码以轻松处理丢失的列之后,您发现它太慢了,您可以考虑进行优化。您可能需要考虑而不是将每个输入数据行分解为字段并重新组合添加丢失的列,您只需对数据行的文本执行直接字符串替换操作,并根据需要添加额外的分隔符 - 例如如果缺少第四列,您可以将第三个逗号更改为两个逗号以插入缺少的列。

如果在设计算法并对其进行编码后遇到问题,您可以提出一个新问题,包括您的算法和代码,以及该问题的链接,这样人们就可以了解历史,并解释您的问题是什么。毫无疑问,有人会帮助您迈出下一步。

HTH

【讨论】:

  • 谢谢我做到了:)
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2021-06-15
  • 2020-07-16
  • 2019-12-19
  • 2013-04-15
相关资源
最近更新 更多