require 'date'
IN_FNAME = "file.dat"
OUT_FNAME = "out_file.dat"
END_OF_LINE = "\x09"
str_out = ''
File.foreach(IN_FNAME, sep=END_OF_LINE) do |line|
dt_str = line[3..21]
if (DateTime.strptime(dt_str, '%Y-%m-%d %H:%M:%S') rescue nil)
puts dt_str.split(' ')
next
end
arr = line.unpack("C*")
next unless arr.first == 32
a = arr.map(&:chr).select { |c| c.match? /\d/ }
puts a.join
str_out << a.map(&:ord).pack("C*")
end
2017-10-19
15:43:27
83492624790981030100000000000003
2017-12-05
09:32:15
0011040594196328010012371003003810100000
Последний шаг - записать двоичный файл OUT_FNAME
.
File.binwrite(OUT_FNAME, str_out)
#=> 72
Как видно, записано 72 байта. Вот скриншот этого файла при просмотре в шестнадцатеричном редакторе.
Это можно сравнить со снимком экрана, показанным в вопросе.
Мы можем прочитать этот файл, чтобы убедиться, что он был написан правильно.
File.binread(OUT_FNAME)
#=> "834926247909810301000000000000030011040594196328010012371003003810100000"
См. DateTime :: strptime и String # unpack .
Обратите внимание, что для печати даты и времени оба значения должны быть действительными. Например, "0000-19-39 29:00:00"
, которое будет принято простым регулярным выражением, будет пропущено.