在目标C中合并多个具有差异标题瓦片的csv文件



我有多个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"等

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

也就是说一些建议:

  • 您需要决定是否支持通用CSV文件,其中字段值可能包含逗号、换行符或双引号;或字段中不存在这些字符的简单CSV文件。请参阅逗号分隔值(CSV(文件的通用格式和MIME类型的第2节,了解需要解析哪些内容才能支持通用CSV文件,并记住需要使用相同的约定输出值。如果您坚持使用简单的CSV文件,那么NSStringcomponentsSeparatedByString:NSArraycomponentsJoinedByString:可能就是您分别需要解析和输出的全部内容。

  • 考虑首先迭代文件,只读取头行,解析这些行,并生成合并的头列表。您需要保留头的顺序,这样您就可以将它们与数据行配对,因此数组是您选择的容器。您可以选择在合并过程中使用集合,但最终合并的标头列表也应该是一个数组,按您希望它们在合并文件中显示的顺序排列。您可以在下面的dictionary方法中直接使用这些头数组。

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

  • 您可以依次处理每个文件,一次处理一行:读取、解析、生成dictionary,从dictionary中获取一个值数组,在适当的位置丢失值,组合、写入。您永远不需要在任何时候将一个完整的文件保存在内存中。

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

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

HTH-

最新更新