用Ruby将每个数组元素添加到文件的行中

52

如果我有一个字符串数组,例如:

a = ['a', 'b', 'c', 'd']

我希望将元素输出到一个文件(例如 .txt 文件),每行一个元素。到目前为止,我的代码如下:

File.new("test.txt", "w+")
File.open("test.txt", "w+") do |i|
    i.write(a)
end

这使我得到了test.txt文件中数组的一行。 如何迭代该数组,将每个值添加到文件的新行?

5个回答

123

使用Array#each来迭代数组,然后调用IO#puts将每个元素写入文件中(puts会添加一个记录分隔符,通常是换行符):

File.open("test.txt", "w+") do |f|
  a.each { |element| f.puts(element) }
end

或将整个数组传递给puts

File.open("test.txt", "w+") do |f|
  f.puts(a)
end

从文档中得知:

如果使用数组作为参数调用,每个元素将写在新的一行。


你的第一个建议正是我想要的。谢谢。 - edc505
1
提醒一下使用集合而不是数组的人:只有第一个版本有效。 - daniel f.
1
@danielf。没错,正如文档中所述,您必须使用_数组参数_调用puts才能获得该行为。 - Stefan

24

有一个更简单的解决方案:

IO.write("file_name.txt", your_array.join("\n"))

@Dika Suparlan,欢迎来到SO。提供一些解释会很有帮助。这不仅可以验证您的答案,还可以向OP指示他们需要在当前问题和未来可能遇到的情况下做什么。我相信我不是唯一想要从SO社区中学习而不仅仅是得到解决方案的人。最大的成功感在于克服一个艰巨的挑战。;-) - Phill Healey
1
这应该是首选答案。从文档中 -- http://ruby-doc.org/core-2.4.2/IO.html -- IO.write(name, string [, offset] [, opt]) → integer --- 打开文件,可选地定位到给定的偏移量,写入字符串,然后返回已写入的长度。写入后 write 确保文件关闭。如果未给出偏移量,则截断该文件。否则,将不会截断该文件。 - Purplejacket

9
作为另一种选择,您可以将数组使用"\n"连接起来,这样每个元素都在新的一行上,如下所示:
a = %w(a b c d)

File.open('test.txt', 'w') {|f| f.write a.join("\n")}

如果你不想覆盖文本文件中已有的值,只是想在底部添加新信息,则可以这样做:

a = %w(a b c d)

File.open('test.txt', 'a') {|f| f << "\n#{a.join("\n")}"}

4
使用 Array#each 迭代每个元素。在写入文件时,确保添加换行符(\n),否则你将得到一个内容为 abcd 的文件:
a = ['a', 'b', 'c', 'd']
File.open('test.txt', 'w') do |f|
  a.each do |ch|
    f.write("#{ch}\n")
  end
end

@SergioTulentsev,请查看Enumerable文档。没有each - falsetru
什么?这些年我一直以为每个都属于 Enumerable。 - Sergio Tulentsev
@SergioTulentsev,Enumerable只是一个混入模块。它本身并没有定义each方法。 - falsetru
1
对,这取决于每个人。 - Sergio Tulentsev

3
另一个简单的解决方案:
directory = "#{Rails.root}/public/your_directory" #create your_directory before
file_name = "your_file.txt"
path = File.join(directory, file_name)
File.open(path, "wb") { |f| f.write(your_array.join("\n")) }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接