парсинг файлов позиции в ruby - PullRequest
0 голосов
/ 01 июня 2010

У меня есть пример файла положения, как показано ниже.

789754654     COLORA         SOMETHING1     19370119FYY076    2342423234SS323423
742784897     COLORB        SOMETHING2      20060722FYY076    2342342342SDFSD3423

Меня интересуют позиции 54-61 (4 колонка). Я хочу изменить дату на другой формат. Таким образом, окончательный результат будет:

789754654     COLORA         SOMETHING1     01191937FYY076    2342423234SS323423
742784897     COLORB        SOMETHING2      07222006FYY076    2342342342SDFSD3423

Столбцы разделены пробелами, а не символами табуляции. И конечный файл должен иметь точное количество пробелов в качестве исходного файла .... единственное, что должно измениться, должен быть формат даты. Как я могу это сделать? Я написал сценарий, но он потеряет первоначальные пробелы, и расположение будет испорчено.

file.each_line do |line|
 dob = line.split(" ")
 puts dob[3] #got the date. change its format
 5.times {  puts "**" }
end

Кто-нибудь может предложить лучшую стратегию, чтобы позиционирование в исходном файле оставалось прежним?

Ответы [ 4 ]

3 голосов
/ 01 июня 2010

Вы можете использовать строку [диапазон], чтобы заменить часть строки, оставив остальную часть той же.

#!/usr/bin/ruby1.8

line = "789754654     COLORA         SOMETHING1     19370119FYY076    2342423234SS323423"
line[44..57] = "01191937FYY076"
p line
# => "789754654     COLORA         SOMETHING1     01191937FYY076    2342423234SS323423"
1 голос
/ 01 июня 2010

Я бы:

  • Прочитать файл в
  • Разделите линии, как у вас
  • Хранить данные в массиве (временно)
  • Делать все изменения даты и т. Д. Вы хотите, чтобы этот массив
  • Создайте метод, который знает, как правильно выводить ваши данные (с пробелами), чтобы превратить массив обратно в строку
  • Распечатайте, что дает вам этот метод

Посмотрите на String#ljust и / или String#rjust для выполнения метода преобразования.

0 голосов
/ 02 июня 2010

Используйте регулярное выражение, чтобы разбить линию на составные части, а затем соедините их вместе в нужном вам порядке.

lines = [
'789754654     COLORA         SOMETHING1     19370119FYY076    2342423234SS323423',
'742784897     COLORB        SOMETHING2      20060722FYY076    2342342342SDFSD3423'  
]

rx = Regexp.new(/^(\d{9})(\s+)(\S+)(\s+)(\S+)(\s+)(\d{4})(\d{2})(\d{2})(FYY076)(\s+)(\S+)$/)
lines.each do |line|
    match = rx.match(line)      
    puts sprintf("%s%s%s%s%s%s%s%s%s%s%s%s",
        match[1], match[2], match[3], match[4], match[5], match[6],
        match[8], match[9], match[7], match[10],match[11],match[12]  
        )
end           

0 голосов
/ 02 июня 2010

Вы можете использовать String#sub для простого поиска / замены.

>> s.sub(/(\d{8}FYY\d{3})(\s*)/){ "Original: '#$1', Spaces: '#$2'" }
=> "789754654     COLORA         SOMETHING1     Original: '19370119FYY076', Spaces: '    '2342423234SS323423"

Конечно, в вашем случае вы бы вывели переформатированную дату.

>> s.sub(/(\d{8}FYY\d{3})/){ $1.reverse }
=> "789754654     COLORA         SOMETHING1     670YYF91107391    2342423234SS323423"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...