如何将每个数组元素写入不同的文件

时间:2015-07-19 17:22:56

标签: ruby

我的代码:

allfiles = [123, 234, 345]
allurls = ["http://www.123.com", "http://www.234.com"]

for allfile in allfiles
    name = allfile + ".html"
    File.open(name, "w") do |file|
         for allurl in allurls 
           file.write(RestClient.get(allurl))
         end 
    end
end
  

错误:字符串无法强制进入Fixnum(TypeError)

基本上,我想下载相应网址的HTML,并将其保存到以其网址命名的相应文件中。我的代码怎么了?

谢谢!

3 个答案:

答案 0 :(得分:0)

错误出现在

  

name = allfile +" .html"

Hera allfile是一个整数,您正在尝试将其添加到字符串中。你需要转换' allfile'使用 to_s 方法将字符串转换为字符串。

allfiles = [123, 234, 345]
allurls = ["http://www.123.com", "http://www.234.com"]

for allfile in allfiles
    name = allfile.to_s + ".html"
    File.open(name, "w") do |file|
         for allurl in allurls 
           file.write(RestClient.get(allurl))
         end 
    end
end

答案 1 :(得分:0)

首先,文件名前缀必须是字符串,因此要么将allfiles更改为['123', '234', '345'],要么稍后在表达式中使用String#to_s进行转换:

name = allfile.to_s + ".html"

其次,使用for迭代集合在Ruby中是单一的。而是使用Enumerable方法和块样式:

allfiles.each do |allfile|
  File.open("#{allfile}.html") do |file|
    allurls.each {|allurl| file.write RestClient.get(allurl)}
  end
end

OP的评论更新:

domains = ['123', '234', '345']
domains.each do |domain|
  File.open("#{domain}.html") do |file|
    file.write RestClient.get("http://www.#{domain}.com/")
  end
end

仅适用于www。< domain> .com格式的网址。它需要修改才能更通用。

答案 2 :(得分:0)

  

错误:字符串无法强制进入Fixnum(TypeError)

错误是由此行name = allfile + ".html"引起的。您无法将 字符串 添加到 数字 。如下更改它将解决您的问题

allfiles = [123, 234, 345]
allurls = ["http://www.123.com", "http://www.234.com"]

for allfile in allfiles
    name = (allfile).to_s + ".html"
    File.open(name, "w") do |file|
         for allurl in allurls 
           file.write(RestClient.get(allurl))
         end 
    end
end

您也可以使用string interpolation

allfiles = [123, 234, 345]
allurls = ["http://www.123.com", "http://www.234.com"]

for allfile in allfiles
    name = "#{allfile}" + ".html"
    File.open(name, "w") do |file|
         for allurl in allurls 
           file.write(RestClient.get(allurl))
         end 
    end
end