gpt4 book ai didi

ruby : How to remove duplicate lines from a document text?

转载 作者:行者123 更新时间:2023-12-02 03:01:19 25 4
gpt4 key购买 nike

我想从文本中删除重复的行,例如:

1.aabba
2.abaab
3.aabba
4.aabba

运行后:

1.aabba
2.abaab

到目前为止尝试过:

lines = File.readlines("input.txt")
lines = File.read('/path/to/file')
lines.split("\n").uniq.join("\n")

最佳答案

让我们构建一个文件。

fname = 't'

IO.write fname, <<~END
dog
cat
dog
pig
cat
END
#=> 20

参见IO::write 。首先,我们假设您只是想将唯一的行读入数组中。

如果像这里一样,文件不是太大,你可以这样写:

arr = IO.readlines(fname, chomp: true).uniq
#=> ["dog", "cat", "pig"]

参见IO::readlineschomp: true 删除每行末尾的换行符。

如果您希望将该数组写入另一个文件:

fname_out = 'tt'
IO.write(fname_out, arr.join("\n") << "\n")
#=> 12

File.open(fname_out, 'w') do |f|
arr.each { |line| f.puts line }
end

如果您想覆盖fname,请写入新文件,删除现有文件,然后将新文件重命名为fname

如果文件太大,无法保存在内存中并且有许多重复行,您也许可以执行以下操作。

require 'set'

st = IO.foreach(fname, chomp: true).with_object(Set.new) do |line, st|
st.add(line)
end
#=> #<Set: {"dog", "cat", "pig"}>

参见IO::foreach .

如果你想简单地将这个集合的内容写入文件,你可以执行:

File.open(fname_out, 'w') do |f|
st.each { |s| f.puts(s) }
end

如果您需要将集合转换为数组:

st.to_a
#=> ["dog", "cat", "pig"]

这假设您有足够的内存来容纳 stst.to_a。如果没有,你可以写:

st.size.times.with_object([]) do |_,a|
s = st.first
a << s
st.delete(s)
end
#=> ["dog", "cat", "pig"]

如果您没有足够的内存来保存 st,您将需要将文件(逐行)读入数据库,然后使用数据库操作。

如果您希望写入跳过重复项的文件,并且该文件非常大,您可以执行以下操作,尽管包含一个或多个重复项的风险极小(请参阅注释)。

require 'set'

line_map = IO.foreach(fname, chomp: true).with_object({}) do |line,h|
hsh = line.hash
h[hsh] = $. unless h.key?(hsh)
end
#=> {3393575068349183629=>1, -4358860729541388342=>2,
# -176447925574512206=>4}

$.是刚刚读取的行的编号(以 1 为底)。请参阅String#hash 。由于该方法返回的不同值的数量是有限的,而可能的字符串的数量是无限的,因此两个不同的字符串有可能具有相同的哈希值。

然后(假设line_map不为空):

lines_to_keep = line_map.values 
File.open(fname_out, 'w') do |fout|
IO.foreach(fname, chomp: true) do |line|
if lines_to_keep.first == $.
fout.puts(line)
lines_to_keep.shift
end
end
end

让我们看看我们写了什么:

puts File.read(fname_out)
dog
cat
pig

参见File::open .

顺便说一下,对于IO类方法m(包括readwritereadlinesforeach),你可能会看到 IO.m... 写成 File.m...。这是允许的,因为 FileIO 的子类,因此继承了后者的方法。这不适用于我对 File::open 的使用,如 IO::Open是一种不同的方法。

关于 ruby : How to remove duplicate lines from a document text?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59902863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com