Ruby 为什么不';我的正则表达式扫描不行吗?
我有一个脚本,可以扫描文本文件并将其放入CSV文件。它获取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
债务人
信息,然后将债权人
信息放在后面
问题是,它获取每个债务人
,然后为每个债务人
放置相同的债权人
信息,而不是在债务人
下面获取新信息:
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