Ruby 为什么不';我的正则表达式扫描不行吗?

Ruby 为什么不';我的正则表达式扫描不行吗?,ruby,regex,Ruby,Regex,我有一个脚本,可以扫描文本文件并将其放入CSV文件。它获取债务人信息,然后将债权人信息放在后面 问题是,它获取每个债务人,然后为每个债务人放置相同的债权人信息,而不是在债务人下面获取新信息: FasterCSV.open('data.csv', 'a') do |csv| debtor_info = results.scan(/^(\d{2}\-\d{5})(\s+)(.*)(\s+)(Total:)(\s+)(\$(\d+\,? \.?)+)/) debtor_info.ea

我有一个脚本,可以扫描文本文件并将其放入CSV文件。它获取
债务人
信息,然后将
债权人
信息放在后面

问题是,它获取每个
债务人
,然后为每个
债务人
放置相同的
债权人
信息,而不是在
债务人
下面获取新信息:

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

在给定的结构中,您需要将债权人或债务人行扫描到单个列表中,然后处理它,在遇到“当前债务人”时设置一个“当前债务人”

假设
results
实际上只是输入文件的一个片段(您没有说,但看起来很可能):

combined\u info=results.scan(/^(\d{2}-\d{5})(\s+)(\s+)(\s+)(\s+)(\$(\d+\,?\d+\。?)+)+)(\d{1,2})\/(\d{1,2})\/(\d{1,4})){s+(\$(\d+)(\d+\,?\,?\)+)\s+)\s+)\s+(\d{1,5}/
案例编号=“未知”
债务人=“未知”
合计金额=“未知”
每个do行的组合信息|
#如果是债务人,则设置变量,无输出
在(0)处的if行
案例编号=第(0)行
债务人=第(2)条的行
总金额=第(6)行
下一个
结束
#债权人,所以收集数据和输出,注意我们的捕获指数已经移动。
日期=第(8)行
金额=第(12)行
基金编号=第14行
债权人=第(15)行
empty=“”

csv我们可以有一些示例输入吗?您应该在
csv行之后用
结尾关闭第一行,该行将提供所有债务人,然后是所有债权人。。我希望它看起来像上面的示例文本..谢谢,这很有效!而且有道理。。。只是在第二部分把信息改成了行。。。非常感谢。
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
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