gpt4 book ai didi

ruby - 在 Ruby 中按字母顺序逐行合并 2 个文本文件的优雅方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:42:30 24 4
gpt4 key购买 nike

我有 2 个日志文件,它们都包含按时间顺序以日期戳开头的文本行。我想将这两个文件合并到一个文件中,该文件包含按时间顺序合并的两个文件中的所有行。由于日期戳的布局在这种情况下按时间顺序与字母顺序相同。

我编写了一个 Ruby 脚本来执行此操作并且运行良好,但我是一个刚开始学习这门语言的 Ruby 新手,我真正喜欢 Ruby 的一点是它的语法糖和代码的可读性。我忍不住觉得我的解决方案很笨拙,肯定有更好更优雅的方法来解决同样的问题。我不一定要在算法上寻找更好的方法,而是在语法上寻找更好的方法。 Ruby 似乎对几乎所有事情都有一个单一的解决方案,所以也许也可以解决这样的问题。

if ARGV.length != 2
puts "Wrong number of arguments. Expected 2 arguments (path to 2 log files to be merged)"
end

merged_file = File.open("merge_out.txt", "w")
file1 = File.open(ARGV[0], "r")
file2 = File.open(ARGV[1], "r")

line1 = file1.gets
line2 = file2.gets

while (line1 != nil or line2 !=nil)
if line1 == nil
# no more line1 so write line2 and proceed file2
merged_file.puts line2
line2 = file2.gets
elsif line2 == nil
# no more line2 so write line1 and proceed file1
merged_file.puts line1
line1 = file1.gets
else
comp = line1<=>line2
#both lines present, write and proceed the (alphabetically) smaller one
#as this is the one with the earlier time stamp
if comp == -1
merged_file.puts line1
line1 = file1.gets
else
merged_file.puts line2
line2 = file2.gets
end
end
end

那么,如何才能更优雅地做到这一点呢?

最佳答案

有时添加维度会使解决方案更漂亮。本质上,将您的 file1、file2 变量转换为数组 [ file1, file2 ],这会打开很多 Ruby Array 语法来执行您已编码到您的代码中的测试初步解决方案。

if ARGV.length < 2
puts "Wrong number of arguments. Expected 2 or more files to merge."
end

merged_file = File.open("merge_out.txt", "w")

files = ARGV.map { |filename| File.open( filename, "r") }

lines = files.map { |file| file.gets }

while lines.any?
next_line = lines.compact.min
file_id = lines.index( next_line )
merged_file.print next_line
lines[ file_id ] = files[ file_id ].gets
end

所以这不仅更短,而且作为副作用可以一次处理更多的输入文件。尽管如果您不需要它,只需先更改回来检查即可。

关于ruby - 在 Ruby 中按字母顺序逐行合并 2 个文本文件的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20969921/

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