【问题标题】:Create an array from each line of a file in Ruby Rake在 Ruby Rake 中从文件的每一行创建一个数组
【发布时间】:2018-01-08 18:25:46
【问题描述】:

我想在 Ruby rake 中创建一个名为 ARRAY 的数组,其中 infile(“infile.txt”)的每一行都是数组的一个元素。 到目前为止,这是我尝试过的方式:

desc "Create new array"
task :new_array do
ARRAY=Array.new
end

desc "Add elements to array"
task :add_elements => [:new_array] do
File.open("infile.txt").each do |line|
ARRAY.push(#{line})
end
end

但是,我收到以下错误:

syntax error, unexpected keyword_end, expecting ')'

ARRAY.push(#{line})”之后的结尾

有人可以向我解释问题是什么,或者让我知道另一种方法吗?

非常感谢!

【问题讨论】:

  • 似乎语法错误来自传递给#push的参数 - 你传入了line的字符串插值,但没有将其包装在字符串中。尝试将其更改为"#{line}"
  • 你的意思是IO::readlines 例如File.readlines("infile.txt")
  • @engineersmnky 我不想使用它,因为我在每个数组元素的末尾都有换行符,这是我不想要的。尽管可能有一些方法可以删除它们(例如,使用下面建议的 chomp )。感谢您的建议。
  • 很好File.foreach("infile.txt").map {|line| line.chomp }

标签: arrays ruby rake


【解决方案1】:

您的问题是您尝试在字符串之外使用字符串插值 (#{...}):

ARRAY.push(#{line})
# ---------^^^^^^^

您可以通过添加一些双引号来使用字符串插值:

ARRAY.push("#{line}")

但无需将字符串 (line) 转换为相同的字符串 ("#{line}"),因此您可以直接推入数组:

ARRAY.push(line)

或者您可以跳过所有显式迭代并使用#to_a

array = File.open("infile.txt").to_a

如果你想去掉换行符:

array = File.open('infile.txt').map(&:chomp)

正如 engineersmnky 在 cmets 中指出的那样,使用 File.readlines 会是更好的方法:

array = File.readlines('infile.txt')
array = File.readlines('infile.txt').map(&:chomp)
#...

并且不要忘记检查IOFile 处理文件时的方法。

【讨论】:

  • 在显示的最后 2 个选项中,文件将保持为 open,因为没有将块传递给 open,并且由于它仍未分配,因此您必须等待 GC 在关闭之前收集它.也许可以改为使用File.readlines('infile.txt') 作为第一个,File.open('infile.txt') { |f| f.map(&:chomp) }File.foreach('infile.txt').map(&:chomp) 作为第二个。
【解决方案2】:

你也可以这样做:

array = []

IO.foreach("path/to/file.txt") { |line|

  array.push(line.chomp)

} 

如果你想从空行中清除数组,只需使用 delete:

array.delete("")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多