从Ruby或其他方式删除开头文本文件中的注释

时间:2012-08-10 12:38:02

标签: ruby database import

我的问题是:我有一些非常大的数据文件(总计几千兆字节),除了实际数据外,还包括文件开头的一些注释行。

所以他们看起来像这样:

# This is a file containing data.
# Here's how to use it:
# ...
# Now, let's get to the actual data:
DATA DATA DATA

我要完成的任务是尽快删除这些文件中的注释,因为我用它来将它们摄取到我的数据库中的工具无法处理注释。

我目前的方法是:

# For each data file...
system "sed '/^\\#/d' #{filename} > #{filename}.tmp"
system "mv #{filename}.tmp #{filename}"

这样可行,但总共需要1个小时,因为文件太大了。我的假设是必须有一种更有效的方法来做到这一点,因为我确信评论仅在文件的开头 ,所以不需要为整个文件搜索它们。

我不关心解决方案是使用纯Ruby还是像上面那样的shell命令,只要它比当前方法运行得快得多。

2 个答案:

答案 0 :(得分:0)

嗯。你的方法很健全。分离系统工具是大文件的一个很好的策略。

我想知道这么简单的转码怎么会这么慢。有些事要探讨......

  • 您确定sed(1)步骤是慢速部分吗?如果真的导入速度很慢,请确保您没有将每一行划分为单独的事务
  • 您的文件是否属于某种网络卷?如果是这样,您可以在服务器而不是客户端上运行脚本吗?

答案 1 :(得分:0)

是的,你可以这样快速地做到这一点,我想你只想让#离开,否则适应但请记住,写入的字符串需要与字符串读取完全一样长。

File.open('big.txt', 'rb+') do |file|
  loop do
    line = file.readline
    if (line[0]=='#')
      file.seek(-line.length, IO::SEEK_CUR)
      file.write line.sub!(/#/," ")
    else
      break
    end
  end
end