Ruby 嵌套,用于比较两个数组不';与最后一项不匹配

Ruby 嵌套,用于比较两个数组不';与最后一项不匹配,ruby,list,foreach,compare,Ruby,List,Foreach,Compare,我需要比较两个用户guid文件 FileA包含从客户端发送的列表,并且包含重复项,FileB是我们系统中的用户GUID列表 我的第一项任务是确保我们的系统具有来自客户端系统的所有唯一用户GUID(即FileB包含FileA中的所有用户GUID)。之后,我需要确定系统中有多少用户guid不在客户机列表中,但这是另一项任务,与此无关 这些文件每行包含一个guid,所以我将它们读入数组,并使用嵌套的for-each来比较它们 这是我的代码: # Open each file of users File

我需要比较两个用户guid文件

FileA
包含从客户端发送的列表,并且包含重复项,
FileB
是我们系统中的用户GUID列表

我的第一项任务是确保我们的系统具有来自客户端系统的所有唯一用户GUID(即
FileB
包含
FileA
中的所有用户GUID)。之后,我需要确定系统中有多少用户guid不在客户机列表中,但这是另一项任务,与此无关

这些文件每行包含一个guid,所以我将它们读入数组,并使用嵌套的for-each来比较它们

这是我的代码:

# Open each file of users
FileA = File.open("file_a.txt")
FileB = File.open("file_b.txt")

# Turn file_a into an array with only unique values and close the file
file_a_array = IO.readlines(FileA).uniq
FileA.close

# Turn the local file into an array, we already know each line is unique
file_b_array = IO.readlines(FileB)
FileB.close

file_a_array.each do |i|
    file_b_array.each do |j|
        if i == j
            puts i
        end
    end
end
FileA Contents:
guid_a
guid_b
guid_c
guid_d
[empty line]

FileB Contents:
guid_a
guid_aa
guid_b
guid_bb
guid_c
guid_cc
guid_d
这段代码同样要返回所有匹配项,但实际上我看到了所有匹配项,除了一个,顺便说一句,是FileB列表上的最后一个

在试图猜测为什么我没有看到最后一场比赛时,我注意到FileA在文件末尾有一个空行,但FileB没有

这里有一个例子:

# Open each file of users
FileA = File.open("file_a.txt")
FileB = File.open("file_b.txt")

# Turn file_a into an array with only unique values and close the file
file_a_array = IO.readlines(FileA).uniq
FileA.close

# Turn the local file into an array, we already know each line is unique
file_b_array = IO.readlines(FileB)
FileB.close

file_a_array.each do |i|
    file_b_array.each do |j|
        if i == j
            puts i
        end
    end
end
FileA Contents:
guid_a
guid_b
guid_c
guid_d
[empty line]

FileB Contents:
guid_a
guid_aa
guid_b
guid_bb
guid_c
guid_cc
guid_d
请注意,每个文件都包含
guid\u d
,但运行我的代码的结果返回以下匹配项:

guid_a
guid_b
guid_c
当我在
FileB
的末尾加了一行时,我突然得到了完整的集合


那么问题是为什么呢?

您遗漏了一些关于文件格式以及如何阅读内容的重要信息,因此我将有根据地猜测您的比较包括换行符或返回字符。因此,在添加换行符之前,列表中的最后一项是不同的。

您遗漏了一些有关文件格式以及如何读取内容的重要信息,因此我将有根据地猜测您的比较包括换行符或返回字符。因此,在添加换行符之前,列表中的最后一项是不同的

所以我的问题是,为什么我需要一个空行,以便最后一个项目显示在匹配项目的结果中

因为最后一个项目也会像其他项目一样以换行符结束

所以我的问题是,为什么我需要一个空行,以便最后一个项目显示在匹配项目的结果中


因为最后一个项目也会像所有其他项目一样以换行符结束。

我添加我自己的答案,因为这里的两个答案在技术上都是正确的,但描述性不强,无法引导我找到解决方案。直到我自己弄明白后,我才最终明白他们在说什么

当我使用
IO.readlines
将文件加载到数组中时,每个数组项的内容都包含一个换行符
\n


因此,离开我原来问题中的示例,
guid\u d
不匹配的原因是,在文件\u a\u数组中,用于比较的值是
guid\n
,而文件\u b\u数组中的值是
guid\u d
。带有
guid\u d
的文件B的行不包含换行符,直到我通过添加空的最后一行来添加它。

我添加我自己的答案,因为这里的两个从技术上讲都是正确的,但都不是很好的描述,也没有引导我找到解决方案。直到我自己弄明白后,我才最终明白他们在说什么

当我使用
IO.readlines
将文件加载到数组中时,每个数组项的内容都包含一个换行符
\n


因此,离开我原来问题中的示例,
guid\u d
不匹配的原因是,在文件\u a\u数组中,用于比较的值是
guid\n
,而文件\u b\u数组中的值是
guid\u d
。带有
guid\u d
的文件B的行不包含换行符,直到我通过添加空的最后一行来添加它。

使用
chomp
函数

此函数用于删除字符串中的拖尾换行符,以便用于清理文件中的输入。正如你在回答中提到的,Ruby阅读包括换行符在内的行

guid\u d不匹配的原因是在
文件\u a\u数组
中,用于比较的值是
guid\u d\n
,而
文件\u b\u数组
中的值是
guid\u d

使用
chomp
修复此问题

"guid_d\n".chomp # => "guid_d"
"guid_d".chomp # => "guid_d"
更改您的程序以使用

IO.readlines(...).map(&:chomp)...

使用
chomp
功能

此函数用于删除字符串中的拖尾换行符,以便用于清理文件中的输入。正如你在回答中提到的,Ruby阅读包括换行符在内的行

guid\u d不匹配的原因是在
文件\u a\u数组
中,用于比较的值是
guid\u d\n
,而
文件\u b\u数组
中的值是
guid\u d

使用
chomp
修复此问题

"guid_d\n".chomp # => "guid_d"
"guid_d".chomp # => "guid_d"
更改您的程序以使用

IO.readlines(...).map(&:chomp)...

接近票数的人是否想解释为什么应该关闭?我提出了一个相当详细的问题。对不起,我不是Ruby天才。我重写了这个问题,因为其他人似乎认为我问的不清楚。接近票数的人想解释为什么应该关闭这个问题吗?我提出了一个相当详细的问题。对不起,我不是Ruby天才。我重写了这个问题,因为其他人似乎认为我问的不清楚。你可以使用
chomp
函数来清理输入,请参阅我的答案。你可以使用
chomp
函数来清理输入,请参阅我的答案。@sanpaco很高兴听到!最好在这个答案上打勾。@sanpaco很高兴听到这个消息!最好勾选这个答案,然后打勾。