使用File.readlines从单独的Ruby文件中读取行

时间:2014-11-28 03:30:51

标签: ruby csv

我在一个文件夹中只有两个文件。

" seed.rb",其中包含种子数据:

Jones,James
Williams,Violet
Walton,Briggs

" code.rb",其中包含代码:

require_relative 'seed'

class TransferInformation
  def read_seed_data_from_file(filename)
    File.readlines(filename).each do |line|
      puts line
    end
  end
end

read_seed_data_from_file(seed)

在控制台中,我运行了ruby code.rb

我现在得到的错误是" seed.rb"中第3行意外的输入结束。

2 个答案:

答案 0 :(得分:2)

“seed.rb”不是Ruby文件。不要require(或require_relative)非Ruby文件。只需删除require_relative即可。

我还建议将“seed.rb”重命名为不那么具有欺骗性的东西,例如“seed.csv”(comma-separated values file的常用扩展名)。

答案 1 :(得分:2)

首先,请理解CSV文件有一个标准。尝试编写自己的代码来读取和写入代码的人经​​常会忽略它,但标准仍然存在。而且,通过使用预先构建的轮子,如Ruby附带的the CSV class,您生成正确的CSV数据的几率就会上升,就像您阅读它的几率一样。

该文档的示例显示了如何从文件和字符串读取和写入CSV数据,因此这是起点。从文件中逐行读取行看起来像:

CSV.foreach("path/to/file.csv") do |row|
  # use row here...
end

所以要阅读你的数据:

require 'csv'

CSV.foreach("test.csv") do |row|
  puts row.reverse.join(' ')
end

运行输出:

James Jones
Violet Williams
Briggs Walton

您希望在大多数情况下逐行读取CSV,因为您只关注一行。数据库转储通常采用CSV格式,并且同时尝试read大型数据库的整个转储文件(“啜泣”)可能会导致程序失效。

现在,有关您的代码的一些评论:

  • TransferInformation不是一个好名字。类应该是一个东西,如“IncomingData”,“Data”或“UserNames”或“Names”。方法是动作或动词。
  • 你不能说

    read_seed_data_from_file(seed)
    

    因为该方法是TransferInformation类的一部分。您需要创建该类的实例,然后您可以调用方法:

    ta = TransferInformation.new
    ta.read_seed_data_from_file('test.csv')
    

看起来很对,但尚未经过测试。