Ruby извлечение данных из текстового файла - PullRequest
6 голосов
/ 01 апреля 2011

У меня есть относительно большой текстовый файл с блоками данных, расположенными примерно так:

ANALYSIS OF X SIGNAL, CASE: 1
TUNE X =  0.2561890123390808

    Line Frequency      Amplitude             Phase             Error         mx  my  ms  p

1 0.2561890123391E+00 0.204316425208E-01 0.164145385871E+03 0.00000000000E+00   1   0   0   0
2 0.2562865535359E+00 0.288712798671E-01 -.161563284233E+03 0.97541196785E-04   1   0   0   0

(они содержат больше строк, а затем повторяются)

Я хотел бы сначала извлечьчисловое значение после TUNE X = и вывод их в текстовом файле.Затем я хотел бы извлечь числовые значения LINE FREQUENCY и AMPLITUDE в виде пары значений и вывести их в файл.

Мой вопрос заключается в следующем: хотя я мог бы сделать что-то более бесполезным, работая сREGEXP Я не уверен, что это правильный способ, и мне хотелось бы получить несколько советов или примеров кода, показывающих, как я могу сделать это эффективно с Ruby.

Ответы [ 4 ]

3 голосов
/ 01 апреля 2011

Как правило, (не проверено)

toggle=0
File.open("file").each do |line|
    if line[/TUNE/]
        puts line.split("=",2)[-1].strip
    end
    if line[/Line Frequency/]
        toggle=1
        next
    end
    if toggle
        a = line.split
        puts "#{a[1]} #{a[2]}"
    end
end

просматривайте файл строка за строкой, проверяйте / TUNE /, затем разделяйте на «=», чтобы получить последний элемент. Сделайте то же самое для строк, содержащих / Line Frequency / и установите флаг переключения в 1. Это означает, что остальная часть строки содержит данные, которые вы хотите получить. Поскольку частота и амплитуда находятся в полях 2 и 3, то разбейте на линии и получите соответствующие позиции. Вообще, это идея. Что касается переключения, вы можете установить флаг переключения на 0 в следующем блоке, используя шаблон (например, SIGNAL CASE или ANALYSIS)

1 голос
/ 01 апреля 2011
file = File.open("data.dat")
@tune_x = @frequency = @amplitude = []
file.each_line do |line|
  tune_x_scan = line.scan /TUNE X =  (\d*\.\d*)/
  data_scan = line.scan /(\d*\.\d*E[-|+]\d*)/
  @tune_x << tune_x_scan[0] if tune_x_scan
  @frequency << data_scan[0] if data_scan
  @amplitude << data_scan[0] if data_scan
end
1 голос
/ 01 апреля 2011

Есть много способов сделать это.Это простой первый шаг:

text = 'ANALYSIS OF X SIGNAL, CASE: 1
TUNE X =  0.2561890123390808

    Line Frequency      Amplitude             Phase             Error         mx  my  ms  p

1 0.2561890123391E+00 0.204316425208E-01 0.164145385871E+03 0.00000000000E+00   1   0   0   0
2 0.2562865535359E+00 0.288712798671E-01 -.161563284233E+03 0.97541196785E-04   1   0   0   0

ANALYSIS OF X SIGNAL, CASE: 1
TUNE X =  1.2561890123390808

    Line Frequency      Amplitude             Phase             Error         mx  my  ms  p

1 1.2561890123391E+00 0.204316425208E-01 0.164145385871E+03 0.00000000000E+00   1   0   0   0
2 1.2562865535359E+00 0.288712798671E-01 -.161563284233E+03 0.97541196785E-04   1   0   0   0

ANALYSIS OF X SIGNAL, CASE: 1
TUNE X =  2.2561890123390808

    Line Frequency      Amplitude             Phase             Error         mx  my  ms  p

1 2.2561890123391E+00 0.204316425208E-01 0.164145385871E+03 0.00000000000E+00   1   0   0   0
2 2.2562865535359E+00 0.288712798671E-01 -.161563284233E+03 0.97541196785E-04   1   0   0   0
'

require 'stringio'
pretend_file = StringIO.new(text, 'r')

Это дает нам объект StringIO, который мы можем представить как файл.Мы можем читать из него по строкам.

Я немного изменил числа, чтобы было легче видеть, что они записываются в вывод.операторы для дескриптора файла: fileh.print

Вывод выглядит так:

# >> 0.2561890123390808
# >> 0.2561890123391E+00 0.204316425208E-01
# >> 0.2562865535359E+00 0.288712798671E-01
# >> 1.2561890123390808
# >> 1.2561890123391E+00 0.204316425208E-01
# >> 1.2562865535359E+00 0.288712798671E-01
# >> 2.2561890123390808
# >> 2.2561890123391E+00 0.204316425208E-01
# >> 2.2562865535359E+00 0.288712798671E-01
0 голосов
/ 01 апреля 2011

Вы можете читать ваш файл построчно и вырезать каждый по номеру символа, например:

  • , чтобы извлечь tune x получить символы от 10 до 27 в строке 2
  • извлечь LINE FREQUENCY получить символы от 3 до 22 в строке 6+n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...