如何从文件中删除所有空字符?

时间:2014-08-01 05:30:12

标签: ruby regex file null-character

我有一个包含很多PGN国际象棋文件的目录,我想从中删除移动时间(写成[%emt {a_number}]。我写了这个脚本:

regex = /\[.emt[^\]]+\]/
directory = "path/to/files"
extension = ".pgn"

Dir.chdir(directory)
Dir.foreach(directory) do |file_name|
    file_object = File.open(file_name, "r+")
    contents = file_object.read
    new_contents = contents.gsub(regex, "")
    File.truncate(directory + "/" + file_name, 0)
    file_object.puts(new_contents)
    file_object.close
end

这删除了所有的移动时间,但奇怪的是它在文件的开头附加了大量的空字符(我怀疑这个数字等于文件中的字节数)。所以我用new_contents = contents.gsub(regex, "")替换了行contents.delete("\0"),但这只会使情况变得更糟,在文件的开头附加更多的空字符。我该如何删除它们?

2 个答案:

答案 0 :(得分:1)

如果替换它应该可以正常工作:

File.truncate(directory + "/" + file_name, 0)

使用:

file_object.rewind

file_object.seek(0)

File.truncate不应该应用于打开文件(如此处所示),file_object.truncate不应该跟file_object.close以外的任何文件操作一起使用。

如果您已经有一个要删除的空文件,请将该文件读入字符串str,关闭该文件,执行

str.delete!("\000")

然后将str写回文件。

答案 1 :(得分:0)

不是截断文件,而是更好地重新打开它以进行写入,因为它会自动被截断。我相信你错过了指定正确的路径:

file_path = File.join(directory, file_name)
contents = File.read(file_path)  ## Previously just file_name.
new_contents = contents.gsub(regex, "")
File.open(file_path, 'w') do |file_object|
    file_object.puts(new_contents)
end

也许您不想使用puts,因为与编写ascii数据相比,在编写二进制数据时它会有所不同:

File.write(file_path)