Разбор текста с разными разделителями - с группировкой - PullRequest
2 голосов
/ 08 февраля 2012

Я редактирую свой предыдущий пост, потому что добился определенного прогресса, но сейчас немного застрял:

Пример текстового файла приведен ниже.Теперь я могу прочитать файл, выполнить анализ, чтобы получить нужные мне данные и вывести файл.Однако выходные данные помещают данные в отдельные строки, и мне нужно, чтобы выходной файл поместил (имя, срок действия, last_used, адрес1, адрес2, город, штат, почтовый индекс) в одну строку, разделенную запятыми.

Вот код на данный момент:

def is_numeric?(object)
true if Float(object) rescue false
end



def load_file
raw_records = []
infile = File.open("testfile.txt", "r") 
#counter =1 

while line = infile.gets
possible_account_number = line[0,16]
if is_numeric?(possible_account_number)
  account_number= possible_account_number[5,11]
  name = line[21,27].strip.gsub(/\,/,"")
  expire_date = line[108,8].strip
  last_used = line[117,8].strip    
  line = infile.gets
  line = infile.gets
  address1 = line.strip.gsub(/\,/,"") #needed for some random commas
  line = infile.gets
  address2 = line.strip.gsub(/\,/,"")
  line = infile.gets
  city = line[21, 20].strip.gsub(/\,/,"")
  state = line[42, 2]
  zip = line[45, 5]
  record = [name, expire_date,last_used, address1, address2, city, state, zip]
  raw_records << record
  #counter = counter + 1
 end

end
infile.close
puts raw_records.map {|record| record*','}

File.open('test_w.txt', 'w') do |f2|   
f2.puts raw_records.map {|record| record*','} 
end


end

#the_string.gsub(/\,/,"")


load_file

Вот необработанные данные:

11111 ABC MOVINGABC, INC                   1234567891 LISTINGS                 02-06-12  MONDAY             2112-001-001  PAGE     1
      1234 CUSTOMIA ROAD  SUITE 12345      LIST MANAGEMENT
      NOSAOLOS        NV 12345


STATEMENTS TISSUE    STATEMENTS NAME 1                 ABC        TISSUES       TISSUE ROAD        LOC      TISSUES  PAGE ABC TISSUE
                     STATEMENTS NAME 2
                     ADDRESS LINE 1
                     ADDRESS LINE 2
                     CITY                 ST ZIP

TITLE   TISSUE NUMBER: 123456789

1234567890000030     MARILYN SMITH                  12345678911                                             05-30-12 01-28-12

                     1234 ST MARYS BLVD.
                     SUITE B
                     NOSAOLOS             MI 12345

1234567890000048     MARILYN ACTIVITA               12345678911                                             05-30-12 09-04-11

                     1234 ST MARYS BOULEVARD
                     STE. B
                     NOSAOLOS             OH 12345

1234567890000055     ANDREW WAYMENT                 12345678911                                             05-30-12 01-12-12

                     123 S. DESCRIBE ST.

                     NOSAOLOS             OH 12345

Вот готовый текст - с помощью Джейсона (спасибо):

MARILYN SMITH,5-30-12 ,1-28-12,1234 ST MARYS BLVD.,SUITE B,NOSAOLOS,MI,12345
MARILYN ACTIVITA,5-30-12 ,9-04-11,1234 ST MARYS BOULEVARD,STE. B,NOSAOLOS,OH,12345
ANDREW WAYMENT,5-30-12 ,1-12-12,123 S. DESCRIBE ST.,,NOSAOLOS,OH,12345

Я также хотел сохранить его в файл, и я использовал это:

File.open('test_w.txt', 'w') do |f2|   
f2.puts raw_records.map {|record| record*','} 
end

Андрей

1 Ответ

0 голосов
/ 09 февраля 2012

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

Файл выглядит как вкладкас разделителями, чтобы вы могли разделить строки на табуляцию:

File.open('filename', 'r') do |file|
  lines = file.inject([]){|memo, line| memo.push line.split(/\t/)}
  # Now you have an array of arrays that you can parse with a state tracker
end

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

...