ruby新手在这里。 我正在使用Ruby版本1.9.2。 我在军事设施工作,每当需要向我们的供应商发送支持数据时,都需要清除IP和主机名信息。 这对我来说是新的angular色,现在在处理支持问题时,清理文件(包括文本和二进制文件)的任务就落在了我的头上。
我创build了以下脚本来“清理”IP地址信息的纯文本文件:
File.open("subnet.htm", 'r+') do |f| text = f.read text.gsub!(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/, "000.000.000.000") f.rewind f.write(text) end
我需要修改我的脚本来search和replace文本文件和.dat二进制文件的主机名和IP地址信息。 我正在寻找一些非常简单的东西,就像我上面的小脚本一样,我希望把txt和dat文件的处理作为单独的脚本来处理。 创build一个脚本来完成这两个脚本的任务是我想从两个单独的脚本作为学习练习。 现在我在一定的时间限制下擦洗支持文件并发送出去。
我的优先考虑是清理我的二进制.dat跟踪文件,它是XML数据types。 这些是来自我们存储arrays的二进制性能跟踪文件,他们需要在发送之前清除标识的IP地址信息以支持分析。
我已经searchstackoverflow.com有点广泛,并没有find答案,解决我的具体需求的问题,我只是有一个时间试图找出string.unpack。
谢谢。
一般来说,Ruby处理二进制文件与其他文件一样,有两个注意事项:
在Windows上,读取文件通常会将CRLF对转换为LF。 您需要以二进制模式读取以确保没有转换:
File.open('foo.bin','rb'){ ... }
为了确保您的二进制数据在Ruby 1.9+下的某些其他编码中不被解释为文本,您需要指定ASCII-8BIT编码:
File.open('foo.bin','r:ASCII-8BIT'){ ... }
但是,正如在这篇文章中指出的那样,如上所示设置'b'标志也会为您设置编码。 因此,只需使用上面的第一个代码片段即可。
但是,正如@ennuikiller的评论所指出的,我怀疑你实际上并没有真正的二进制数据。 如果你真的用非ASCII编码(例如UTF-8)读取文本文件,那么将它们视为二进制文件的一个小概率偶然会发现只有一半的多字节编码,并对结果文件造成伤害。
编辑:要在XML文件上使用Nokogiri,你可以做如下的事情:
require 'nokogiri' File.open("foo.xml", 'r+') do |f| doc = Nokogiri.XML(f.read) doc.xpath('//text()').each do |text_node| # You cannot use gsub! here text_node.content = text_node.content.gsub /.../, '...' end f.rewind f.write doc.to_xml end
我已经做了一些二进制文件解析,这是我如何阅读和清理它:
data = File.open("file", 'rb' ) {|io| io.read}.unpack("C*").map do |val| val if val == 9 || val == 10 || val == 13 || (val > 31 && val < 127) end
对于我来说,我的二进制文件没有顺序字符串,所以我必须做一些移位和过滤,然后才能读取(因此, .map do |val| ... end
与"C"
标签解压缩(请参阅http://www.ruby-doc.org/core-1.9.2/String.html#method-i-unpack )将给出ASCII字符代码而不是字母,所以如果你想使用val.chr
解释的字符,而不是。
我建议你在二进制编辑器中打开文件,并通过它们来确定如何最好地处理数据解析。 如果他们是XML,你可以考虑使用Nokogiri或类似的XML工具来解析它们。