您好我正在使用Ruby / cucumber并且需要开发一个比较模块/程序来比较两个文件。
以下是要求
该项目是一个迁移项目。来自一个应用程序的数据被移动到另一个
需要将现有应用程序的数据与新应用程序的数据进行比较。
解决方案:
我已根据上述要求在Ruby中开发了一个比较引擎。
a)从数据库获取数据,复制和排序 b)将数据放入带有“||”的文本文件中作为分隔符 c)使用在db中提供唯一记录的键列(编号)来比较两个文件
对于ex,File1有1,2,3,4,5,6,file2有1,2,3,4,5,7,列1,2,3,4,5是关键列。我使用这些键列并比较6和7,这会导致失败。
问题:
我们在这里面临的主要问题是,如果100,000个记录或更多记录的不匹配率超过70%,则比较时间很长。 如果不匹配小于40%,那么比较时间就可以了。
Diff和Diff -LCS在这种情况下不起作用,因为我们需要关键列来实现两个应用程序之间的准确数据比较。
如果对于100,000条记录或更多记录的不匹配率超过70%,是否还有其他方法可以有效地缩短时间。
由于
答案 0 :(得分:0)
假设你在2个文件中有这个摘录:
# File 1
id | 1 | 2 | 3
--------------
1 | A | B | C
2 | B | A | C
# File 2
id | 1 | 2 | 3
--------------
8 | A | B | C
9 | B | B | B
我们执行以下功能,使用哈希(直接访问):
def compare(data_1, data_2)
headers = data_1.shift
if headers.size != data_2.shift.size
return "Headers are not the same!"
end
hash = {}
number_of_columns = headers.size
data_1.map do |row|
key = ''
number_of_columns.times do |index|
key << row[index].to_s
end
hash[key] ||= row
end
data_2.each do |row|
key = ''
number_of_columns.times do |index|
key << row[index].to_s
end
if hash[key].nil?
# present in file 1 but not in file 2
else
# present in both files
end
end
end
# usage
data_file_1 = your_method_to_read_the_file(file_1)
data_file_2 = your_method_to_read_the_file(file_2)
compare(data_file_1, data_file_2)