如何在ruby中修改文本文件

时间:2010-07-20 12:01:01

标签: ruby

我有一个名为ama.txt的文件,文件内容如下:

name      age   hobby       sex

amit      45    music       male

sumit     35    cricket     female

现在我可以这样打开文件:

File.open("ama.txt").each do

end

如何修改文件的hobby列?

2 个答案:

答案 0 :(得分:16)

这种情况的一般模式大致如下:

  1. 打开原始文件进行读取,打开新文件进行写入。逐行阅读原文。
  2. 跳过任何不相关的行(例如,您想跳过标题行和空白行)
  3. 根据您的需要处理各个行。在这里你可能想要cols = line.split(/\s+/)这样的东西然后你想要编辑cols[2],虽然我不知道这些变化是否符合模式或什么。
  4. 完成编辑后,将已编辑的行打印到新文件
  5. 完成阅读原文并将更改的行写入新文件后,请关闭这两个文件。
  6. 将原始名称更改为“original_name”+“。bak”,将新文件名称更改为“original_name”。
  7. 完成。
  8. 像大多数脚本语言一样,Ruby有很多内置的方法可以使这些步骤更快,但这是基本模式。 Dmitry可能是正确的,CSV阅读器可以帮助你,但我看不出你的数据格式是否合格(或不是),所以我甚至都没有进入。

    最后,不要太粗鲁,但似乎你并不熟悉Ruby。为什么Ruby是一个要求?你知道另一种脚本语言吗?你对Ruby有多了解?一般来说,这里的人会帮助你解决问题,但不是简单地为你编写代码。

    回答Amit关于第4步的问题:如果你有一个新的文件打开写,你将有一个文件句柄 - 程序中一个指向打开文件的变量。您可以使用filehandle作为puts的接收者来写入该文件。这看起来很奇怪,因为puts通常看起来像一个函数,但 a method call in Ruby。在irb或简短的Ruby脚本中试试这个:

    fh = File.open('test.txt', 'w')
    fh.puts "hello, world"
    fh.close
    

    另一个简短的例子:

    #!/usr/bin/env ruby
    out_file = File.open('output.txt', 'w')
    
    File.open('input.txt', 'r').each do |line|
      out_file.print line.sub('foo', 'bar')
    end
    
    out_file.close
    # no need to close the input file since the block version closes it for us
    # automagically
    
    # Maybe better to put the whole thing in a double block, though you may
    # find this harder to follow at first
    File.open('output.txt', 'w') do |out_file|
      File.open('input.txt', 'r').each do |line|
        out_file.print line.sub('foo', 'bar')
      end
    end
    

答案 1 :(得分:1)

File.readlines("ama.txt").each do |line|
  row = line.strip.split('\t') # use your delimiter symbol
  row[2] = ... # hobby column
end

或者只使用fastercsv gem。