我有一个包含很多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")
,但这只会使情况变得更糟,在文件的开头附加更多的空字符。我该如何删除它们?
答案 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)