【问题标题】:Ruby want to read file line by line and get the particular part out using gsubRuby 想逐行读取文件并使用 gsub 获取特定部分
【发布时间】:2020-09-28 13:21:21
【问题描述】:

我正在编写代码来逐行读取包含 url 的文本文件或 csv 文件,并且我想要输出每个 url 的 id 并打印或存储在文本文件中,但是当我这样做时,当我使用在循环之前循环我能够逐行打印它。任何人都可以帮助我。 下面是我的代码示例。

line_num=0
File.open('/Users/divyanshu/python_imdb/channels/url.txt').each do |line|
video_links = "#{line_num += 1} #{line}"
# puts video_links

for video_link in video_links 
 
    video_lin = video_link.gsub('https://www.youtube.com/watch?v=', '')
    video_di = video_lin.gsub('?utm_source=komparify&utm_campaign=site&utm_medium=detailpage', '')
    puts video_di
end 

这是我遇到的错误

Traceback (most recent call last):
        2: from /Users/divyanshu/python_imdb/url_validation.rb:6:in `<main>'
        1: from /Users/divyanshu/python_imdb/url_validation.rb:6:in `each'
/Users/divyanshu/python_imdb/url_validation.rb:10:in `block in <main>': undefined method `each' for #<String:0x00007fef3d0907c0> (NoMethodError)

如果我只运行这部分代码,它工作正常。

line_num=0
File.open('/Users/divyanshu/python_imdb/channels/url.txt').each do |line|
    video_links = "#{line_num += 1} #{line}"
    puts video_links
end 

【问题讨论】:

  • 正如错误所说,video_linksString,您无法对其进行迭代。在遍历文件中的行之后,这个变量将只有最后存储的值。或者问题可能在此之前由于空间 - channels /url.txt
  • @Seshadri_C 如果删除空间错误是一样的
  • 我创建了一个答案来解释我的评论。

标签: ruby ruby-on-rails-3 ruby-on-rails-4 rubygems ruby-on-rails-5


【解决方案1】:

字符串不正常#respond_to? :each

堆栈跟踪告诉您需要知道的一切:

#String:0x00007fef3d0907c0 (NoMethodError) 的未定义方法“每个”

即使假设带有尾随空格的/channels / 是文件路径的有效部分,File#open 也会返回一个 File 对象而不是行的集合。正如所写,video_links 是一个字符串,而不是一个集合,例如 Hash 或 Array,并且没有 String#each 方法。由于 for-in 循环是 #each 的语法糖,因此对象无法响应该方法。

根据您是要将整个文件转换成行数组还是逐行操作,您应该使用以下替代方法之一:

  1. File#each_line,继承自 IO。例如:

    File.open("path/to/file").each_line
    
  2. File#readlines,同样继承自 IO。例如:

    File.readlines("path/to/file")
    

【讨论】:

    【解决方案2】:

    补充@Todd 的答案。正如我在评论中提到的,您的代码 sn-p 中还有一个问题。 video_links 变量属于 String 类。

    1. 它将只包含文件的最后一行
    2. 您不能对其进行迭代

    例如,file.txt 如下:

    one
    two
    three
    four
    

    和代码:

    File.open('file.txt').each do |line|
      var = line
    end
    
    puts var
    #=> "four"
    

    因此,使用您的示例,您应该将变量 video_links 定义为(空)数组并附加文件行以进行迭代。

    例子:

    video_links = []
    
    lines_in_file = File.readlines('/Users/divyanshu/python_imdb/channels/url.txt')
    
    lines_in_file.each do |line|
      video_links.append line
    end
    
    video_links.each do |video_link|
      video_lin = video_link.gsub('https://www.youtube.com/watch?v=', '')
      video_di = video_lin.gsub('?utm_source=komparify&utm_campaign=site&utm_medium=detailpage', '')
      puts video_di
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多