【问题标题】:How can I delete all null characters from a file?如何从文件中删除所有空字符?
【发布时间】:2014-08-01 05:30:11
【问题描述】:

我有一个包含很多 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

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

【问题讨论】:

    标签: ruby regex file null-character


    【解决方案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写回文件。

    【讨论】:

      【解决方案2】:

      与其截断文件,不如重新打开它进行写入,因为它会自动被截断。而且我相信您错过了指定正确的路径:

      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)
      

      【讨论】:

        猜你喜欢
        • 2018-03-04
        • 2011-08-24
        • 2023-04-08
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        相关资源
        最近更新 更多