2013-05-14 2 views
0

텍스트 파일을 스캔하여 CSV 파일에 저장하는 스크립트가 있습니다. debtor 정보를 가져온 다음 creditor 정보를 그 다음에 넣습니다.정규 표현식 검색이 작동하지 않는 이유는 무엇입니까?

00-000##  Company Inc       Total: $3,134.55 

    2/25/2003  $416.02 0000BK  A Comp Inc 
    2/25/2003  $105.60 0000BK  California Imprinted Apparel 

    2/25/2003  $58.41 0000BK  John Doe 

    2/25/2003  $33.41 0000BK  E Doe & Assoc 
    2/25/2003  $78.28 0000BK  Candle Candles 

    2/25/2003  $44.74 0000BK  Personnel Svcs 
    2/25/2003  $28.34 0000BK  Jane Doe 

    2/25/2003  $32.77 0000BK  Water Co 

    2/25/2003  $141.21 0000BK  XYX 
    2/25/2003  $250.96 0000BK  PDQ INC 

    2/25/2003  $146.17 0000BK  RS FM 
    2/25/2003  $722.91 0000BK  A Corp 

    2/25/2003  $841.14 0000BK  BAC Corp 
    2/25/2003  $202.57 0000BK  ABC Communications 

    2/25/2003  $32.02 0000BK  YXY SA Corp 

00-00128  May June           Total: $29.60 
    6/26/2002  $29.60 0000BK  May June 

00-00653  Joe Doey            Total: $347.10 

    7/10/2002  $59.62 0000BK  Financial Corp 
    7/10/2002  $287.48 0000BK  ABC Corp 

00-00657  Thomas P Public          Total: $1,096.75 
    7/2/2003  $1,096.75 0000BK  Contract Svc 

00-00735  Jean Jane           Total: $29.89 

    6/18/2003  $29.89 0000BK  Jean Jane 
:

FasterCSV.open('data.csv', 'a') do |csv| 

    debtor_info = results.scan(/^(\d{2}\-\d{5})(\s+)(.*)(\s+)(Total:)(\s+)(\$(\d+\,? \.?)+)/) 

    debtor_info.each do |line| 
    case_number = line.at(0) 
    debtor = line.at(2).strip 
    total_amount = line.at(6) 
    csv << [case_number, debtor, total_amount] 

    creditor_info = results.scan(/((\d{1,2})\/(\d{1,2})\/(\d{1,4}))\s+(\$(\d+\,?\.?)+)\s+(\d{1,5}BK)\s+(.*)/) 

creditor_info.each do |info| 
     date = info.at(0) 
     amount = info.at(4) 
     fund_number = info.at(6) 
     creditor = info.at(7) 
     empty = " " 
     csv << [empty, date, amount, fund_number, creditor] 

    end 
end 
end 

이 일부 샘플 입력 : 그것은 debtor 아래 새로운 정보를 얻을 수 아니에요,

문제가

, 각 debtor 얻을 수 있지만, 각 debtor 동일한 creditor 정보를 넣습니다

+1

샘플 입력이 가능합니까? – squiguy

+1

당신은 줄 끝에서 첫 번째 줄을 닫아야합니다. 'csv << [사례 번호, 채무자, 총 금액] – matov

+0

그러면 모든 채무자가 모두 채권자가됩니다. 위의 샘플 텍스트 .. – user1563849

답변

1

주어진 구조로 을 검색해야합니다. 채권자 또는 채무자가 단일 목록에 입력 한 다음 그것을 통해, 현재의 채무자를 만날 때마다 설정합니다.

실제로 results 가정 할 당신의 입력 파일의 소리내어 먹는다는 (당신이 말을하지 않습니다,하지만 가능성이 보인다) :

combined_info = results.scan(/^(\d{2}\-\d{5})(\s+)(.*)(\s+)(Total:)(\s+)(\$(\d+\,?\d+\.?)+)|((\d{1,2})\/(\d{1,2})\/(\d{1,4}))\s+(\$(\d+\,?\.?)+)\s+(\d{1,5}BK)\s+(.*)/) 
case_number = "unknown" 
debtor = "unknown" 
total_amount = "unknown" 

combined_info.each do |line| 
    # If it's a debtor, set variables, no output 
    if line.at(0) 
    case_number = line.at(0) 
    debtor = line.at(2).strip 
    total_amount = line.at(6) 
    next 
    end 

    # A creditor, so collect data and output, note our capture indices have moved . . . 
    date = line.at(8) 
    amount = line.at(12) 
    fund_number = line.at(14) 
    creditor = line.at(15) 
    empty = " " 
    csv << [case_number, debtor, total_amount, empty, date, amount, fund_number, creditor] 
end 

귀하의 정규 표현식에는 비 제거로 (도, 약간의 작업으로 할 수 - 필요한 캡처),하지만 그것은 당신을 시작하게 만들 것이다.

.scan을 사용하는 대신 입력하는 동안 줄 단위로 식별하는 것과 같이이 데이터 입력을 더 깨끗한 방식으로 맞추는 다른 방법이있을 수 있습니다. 그러나이 대답은 기존 방식을 기반으로합니다.

+0

감사합니다. 그리고 말이 되네요. 그냥 정보를 변경해야만했습니다. 두 번째 부분의 ... 감사합니다! – user1563849

관련 문제