我有两个CSV文件,它们是S3存储桶对象的列表:
The first CSV file represents the objects in the source S3 bucket.
The second CSV file represents the objects in the destination S3 bucket.
我需要通过查找目标存储桶中尚未存在的对象,来了解将哪些文件从源S3存储桶复制到目标存储桶。 CSV的行与路径,大小和修改日期匹配。如果其中任何一个不同,我需要将源对象复制到目标存储桶。
这是第一个示例CSV文件:
folder1/sample/test1,55,2019-07-19 19:36:56 UTC
folder2/sample/test5,55,2019-07-19 19:34:31 UTC
folder3/sample/test9,55,2019-07-19 19:32:12 UTC
这是第二个示例CSV文件:
folder1/sample/test1,55,2019-07-16 19:32:58 UTC
folder2/sample/test5,55,2019-07-14 19:34:31 UTC
folder3/sample/test9,55,2019-07-19 19:32:12 UTC
在此示例中,将返回第一行和第二行。
以下代码可在这3个衬纸上使用,但在1000+行随机生成的文件上将失败:
f1 = File.open('file1.csv', 'r')
f2 = File.open('file2.csv', 'r')
f1.each.zip(f2.each).each do |line1, line2|
if line1 != line2
puts line1
end
end
如何准确比较所有行-最好以最少的CPU /内存开销为准?
答案 0 :(得分:0)
您可以将目标列表加载到内存中的数组中,然后一次单行浏览源列表。如果源行不在数组中,则需要复制文件。
如果即使一个文件太大也无法加载到内存中,并且文件按文件名顺序排序,则可以一起浏览两个文件并比较行。您需要使用文件名来确定是否跳过行以保持同步。
另一种选择是使用 Amazon Athena ,将文件之间的数据连接起来以查找不匹配的行。