首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中编辑文件中的每一行

在Ruby中编辑文件中的每一行
EN

Stack Overflow用户
提问于 2011-03-28 06:00:44
回答 5查看 21.6K关注 0票数 19

我正在尝试找到一种简单的方法来编辑文件中的每一行,但是我在理解如何使用File类来实现这一点时遇到了一些问题。

我要编辑的文件有几百行,每行都有逗号分隔值。我只对每一行的第一个值感兴趣,并且我想删除第一个值之后的所有值。我试着做了以下事情:

代码语言:javascript
复制
File.open('filename.txt', 'r+') do |file|
  file.each_line { |line| line = line.split(",")[0] }
  file.write
  file.close
end

这不起作用,因为File.write方法需要将内容写成参数。

有没有人能告诉我怎样才能达到预期的效果?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-28 06:11:34

更好的解决方案之一(也是最安全的)是使用TempFile创建一个临时文件,并在创建完成后将其移动到原始位置(使用FileUtils):

代码语言:javascript
复制
   require 'fileutils'
   require 'tempfile'

    t_file = Tempfile.new('filename_temp.txt')
    File.open("filename.txt", 'r') do |f|
      f.each_line{|line| t_file.puts line.split(",")[0].to_s }
    end
    t_file.close
    FileUtils.mv(t_file.path, "filename.txt")
票数 24
EN

Stack Overflow用户

发布于 2011-03-28 08:15:18

就地修改文件的另一种方法是使用-i开关

代码语言:javascript
复制
ruby -F"," -i.bak -ane 'puts $F[0]' file
票数 12
EN

Stack Overflow用户

发布于 2011-03-28 06:34:23

使用代码的文件处理与我们在文本编辑器中编辑文件时所做的操作有很大的不同。操作系统提供的文件操作在这方面相当有限(由于许多原因,部分是历史原因-比如磁带)。

简而言之,您可能应该创建另一个文件并向其中写入数据(Mike为此提供了代码),或者将整个文件加载到内存中(如果您的文件很大,这可能不是一个好主意),并用处理过的数据覆盖它。

仅供练习,这里是您实际如何就地编辑文件。如你所见,不是最美的景象:

代码语言:javascript
复制
File.open('foo', 'r+') do |file|
  write_pos = 0
  file.each do |line|
    word = line.chomp.split(',').first
    read_pos = file.pos
    file.pos = write_pos
    file.puts word
    write_pos = file.pos
    file.pos = read_pos
  end
  file.truncate write_pos
end
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5452781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档