Я использую драгоценный камень креветки, чтобы прочитать 60-страничный сборник PDF, содержащий финансовые и демографические данные для десятков людей. Задача, с которой я сталкиваюсь, заключается в том, что я хочу иметь возможность записывать имя/специальный идентификатор (в одной строке) и последующие строки, относящиеся к этому человеку, в то время как каждая строка сканируется. Используя метод сканирования рубина для строк, я был в состоянии захватить только финансовый с каждым матчем возвращения строки таким образом:ruby regex и многострочные строки
[<invoice no.>, <service type>, <modifier (if any)>, <service_date>, <units>, <amount>]
Я попытался связать идентификатор с финансовыми данными несколько строк вниз, и то измените его, когда ИД изменится, но ничего не сработало. Я собираюсь сделать это задним путем? Мой опыт с регулярным выражением скуден (и вообще программирование).
Ниже приведен код, который работает только с финансовыми данными:
PDF::Reader.new(file).pages.each do |page|
page.raw_content.scan(/^\(\s(\d{6})\s+\d\s+(\w\d{4})\s+(0580|TT|1C|1C\s+1F)?\s+(\d+\/\d+\/\d+)\s+\d+\/\d+\/\d+\s+(\d+\.\d+)\s+(\d+\.\d+)/) do |line|
line.collect {|x| x.strip! if !x.nil?}
print "#{line.join(' ')}\n"
Cycle.check_details(line)
end
end
А вот выборки того, что puts page.raw_content
производит (есть много пустых пробелов, содержащихся в этих строках).
(REG LOC CLIENT SERVICE NAME BIRTH DATE RECIPIENT ID PRIOR AUTHORIZATION #)'
(xx xxx xxxxx xxxxxxx LANNISTER, JAIME xx/xx/xxxx xxxx <special ID>)'
(DIAGNOSIS CODES: 887.0)'
()'
( INV # LINE # PROCEDURE CODE REVENUE CD FROM DT THRU DT UNITS AMOUNT)'
(<inv num> 1 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 2 <service_code> <modifier> xx/xx/13 xx/xx/13 2.50 41.00)'
(<inv num> 3 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 4 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 5 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 6 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 7 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
( CLAIM TOTAL
434.60 CLAIM ACCOUNT REF. xxxxxxxxxxxxxxxSUP)'
(REG LOC CLIENT SERVICE NAME BIRTH DATE RECIPIENT ID PRIOR AUTHORIZATION #)'
(xx xxx xxxxx xxxxxxx LANNISTER, JOFFREY xx/xx/xxxx xxxx <special ID>)'
(DIAGNOSIS CODES: 259.0)'
()'
( INV # LINE # PROCEDURE CODE REVENUE CD FROM DT THRU DT UNITS AMOUNT)'
(<inv num> 1 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 2 <service_code> <modifier> xx/xx/13 xx/xx/13 2.50 41.00)'
(<inv num> 3 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 4 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 5 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 6 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
(<inv num> 7 <service_code> <modifier> xx/xx/13 xx/xx/13 4.00 65.60)'
( CLAIM TOTAL
434.60 CLAIM ACCOUNT REF. xxxxxxxxxxxxxxxSUP)'
Вы уверены, что все верно читает? –
Ваши данные сбивают с толку, поэтому я думаю, что вы не показываете его правильно или не разбираете PDF правильно. Линии должны начинаться и заканчиваться округлыми скобками или с одиночными кавычками. Вместо этого ваши строки начинаются с левых парен и закрываются одной кавычкой. Пожалуйста, подтвердите, что правильно, и если что-то не так с данными, пожалуйста, исправьте это. –
@theTinMan, я тоже это заметил, и когда я изначально учился использовать креветку, образец кода для отображения текста в терминале показывал то же самое: '() '' – user1582261