如何修改ruby中的文本文件

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

name age hobby sex amit 45 music male sumit 35 cricket female 

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

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

如何修改文件的hobby列?

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

  1. 打开原始文件进行读取,打开新文件进行写入。 逐行阅读原文。
  2. 跳过任何不相关的行(例如,您想跳过标题行和空白)
  3. 根据您的需要处理各个行。 在这里你可能想要像cols = line.split(/\s+/)然后你想编辑cols[2] ,虽然我不知道这些变化是适合模式还是什么。
  4. 完成编辑后,将编辑过的行打印到新文件中
  5. 完成阅读原文并将更改的行写入新文件后,请关闭这两个文件。
  6. 将原始名称更改为“original_name”+“。bak”,新文件名称更改为“original_name”。
  7. 完成。

与大多数脚本语言一样,Ruby有许多内置方法可以使这些步骤更快,但这是基本模式。 Dmitry可能是正确的,CSV阅读器可以帮助你,但我看不出你的数据有多好(或没有),所以我甚至不打算进入那个。

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

回答Amit关于第4步的问题:如果你有一个新的文件打开写,你将有一个文件句柄 – 程序中一个指向打开文件的变量。 您可以使用filehandle作为puts的接收者来写入该文件。 这看起来很奇怪,因为puts通常看起来像一个函数,但它 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 
 File.readlines("ama.txt").each do |line| row = line.strip.split('\t') # use your delimiter symbol row[2] = ... # hobby column end 

或者只使用fastercsv gem。