【问题标题】:Merging two text files in Ruby在 Ruby 中合并两个文本文件
【发布时间】:2015-09-29 10:46:13
【问题描述】:

我有两个文本文件。其中有以下列表:

dog
cat
horse

另一个有这个:

kennel
flap
shoes

我想将这两个文本文件合并到一个新的文本文件中,以便将术语彼此并排列出,如下所示:

dog kennel
cat flap
horse shoes

我该怎么做呢?到目前为止,这是我的代码,但很大程度上是不正确的:

f1 = File.readlines('C:\\Users\\USERNAME\\Desktop\\hat.txt')
f2 = File.readlines('C:\\Users\\USERNAME\\Desktop\\sat.txt')

File.open('file3.txt','w') do |output_file|

    f1.zip(f2) do |a,b|
        output_file.puts f1,f2
    end

end

【问题讨论】:

  • 什么是f1f2
  • 啊我的错,我已经编辑过了。这应该是有道理的。所以目前它似乎只是将所有内容打印为一个列表而不是一个列表。有没有办法让列表并排排列?

标签: ruby merge


【解决方案1】:

代替

output_file.puts f1, f2

output_file.puts "#{a.chomp} #{b}"

【讨论】:

  • 我收到以下错误:C:/Users/USERNAME/Desktop/test2:19:in block (2 levels) in <main>': undefined method chomp' for ["dog\n", "cat\n", "horse" ]:Array (NoMethodError)
  • 这和其他用户代码一样有效。谢谢!
【解决方案2】:
# get the data
f1 = File.readlines('./text1.txt')
f2 = File.readlines('./text2.txt')

# remove the newlines
f1 = f1.map {|elem| elem.chomp}
f2 = f2.map {|elem| elem.chomp}

File.open('file3.txt', 'w') do |output_file|
  #enumerate over the array length (take advantage of same size for both arrays)
  f1.each_with_index do |elem, i|

  # output the string interpolation
  output_file.puts "#{elem} #{f2[i]}"
  end

end

【讨论】:

    【解决方案3】:

    在闭包中合并,加上返回值

    您可以使用File#open 的块语法为处理合并的方法链创建闭包。在最里面的块中,您可以利用 Enumerable#flat_map 将遍历集合(例如行数组)这一事实,并且格式字符串插值也将接受数组参数。例如:

    File.open('f3', ?w) do |f3|
      File.readlines('f1').
        zip(File.readlines 'f2').
        flat_map { |arr| ln = sprintf "%s %s\n" % arr.map(&:chomp); f3.print ln; ln }
    end
    #=> ["dog kennel\n", "cat flap\n", "horse shoes\n"]
    

    这不仅会为您提供有用的返回值,而且还会正确地将文件 f1 和 f2 合并到一个名为 f3 的新文件中。给定您的语料库,该文件将包含:

    狗窝
    猫瓣
    马鞋

    此外,此代码还将处理每个文件中每行包含多个单词的文件。如果 f1 包含“big dog”而 f2 包含“shoes and hand grenades”,则此代码将 Do The Right Thing™ 并返回:

    #=> ["big dog kennel\n", "cat flap\n", "horse shoes and hand grenades\n"]
    

    这段代码可能过于聪明,但牺牲了可读性,但展示了许多有用的 Ruby 特性(尤其是返回值的实用性),您或其他人可能会觉得这些特性很有帮助。在 Ruby 中做事总是有不止一种方法,有时需要紧凑、富有表现力的代码。您的里程可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多