Как найти двоичный файл и заменить строку на Ruby? - PullRequest
2 голосов
/ 03 ноября 2011

Руби новичок здесь.Я использую Ruby версии 1.9.2.Я работаю на военном объекте, и всякий раз, когда необходимо отправить данные поддержки нашим поставщикам, необходимо удалить информацию об IP-адресе и имени хоста.Это новая роль для меня, и теперь задача обработки файлов (как текстовых, так и двоичных) ложится на меня при работе с вопросами поддержки.

Я создал следующий скрипт для «очистки» файлов в виде простых текстовых файлов с информацией об 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

Мне нужно изменить скрипт для поиска и замены имени хоста И IP-адреса в текстовых файлах И .dat двоичных файлах.Я ищу что-то действительно простое, как мой маленький скрипт выше, и я хотел бы сохранить обработку файлов txt и dat как отдельные скрипты.Задача создания одного сценария для выполнения обоих - это задача, которую я хотел бы взять в качестве учебного упражнения из двух отдельных сценариев.Прямо сейчас я нахожусь под определенным ограничением времени, чтобы очистить файлы поддержки и отправить их.

Приоритет для меня - очистить мои двоичные файлы трассировки .dat, которые имеют тип данных XML.Это двоичные файлы трассировки производительности из наших массивов хранения, и им необходимо удалить информацию об идентифицирующем IP-адресе перед отправкой для поддержки анализа.

Я несколько раз искал stackoverflow.com и не нашел вопрос с ответом, который отвечал бы моим конкретным потребностям, и у меня просто было время, пытаясь выяснить string.unpack.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Обычно Ruby обрабатывает двоичные файлы так же, как и другие файлы, с двумя оговорками:

  1. В Windows при чтении файлов обычно пары CRLF преобразуются в просто LF.Вам нужно читать в двоичном режиме, чтобы гарантировать отсутствие преобразования:

    File.open('foo.bin','rb'){ ... }
    
  2. Чтобы убедиться, что ваши двоичные данные не интерпретируются как текст в какой-либо другой кодировке в Ruby 1.9+, вам нужночтобы указать кодировку ASCII-8BIT:

    File.open('foo.bin','r:ASCII-8BIT'){ ... }
    

    Однако, как отмечено в этом посте , установка флага 'b', как показано выше, также устанавливает кодировку для вас.Таким образом, просто используйте первый фрагмент кода, приведенный выше.

Однако, как отмечается в комментарии @ennuikiller, я подозреваю, что на самом деле у вас нет настоящих двоичных данных.Если вы действительно читаете текстовые файлы с кодировкой, отличной от ASCII (например, UTF-8), существует небольшая вероятность того, что обработка их как двоичного приведет к случайному обнаружению только половины многобайтовой кодировки и нанесению вреда в результирующем файле.

Редактировать: Чтобы использовать Nokogiri для файлов XML, вы можете сделать что-то вроде следующего:

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
1 голос
/ 03 ноября 2011

Я выполнил некоторый анализ двоичного файла, и вот как я его прочитал и почистил:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...