Заранее благодарим за то, что потворствовали любительскому вопросу Perl. Я извлекаю некоторые данные из большого неформатированного текстового файла, и у меня возникают проблемы при объединении использования цикла while и сопоставления регулярных выражений в нескольких строках.
Сначала образец данных:
01-034575 18/12/2007 258,750.00 11,559.00 36 -2 0 6 -3 2 -2 0 2 1 -1 3 0 5 15
-13 -44 -74 -104 -134 -165 -196 -226 -257 -287 -318 -349 -377 -408 -438
-469 -510 -541 -572 -602 -633 -663
Atraso Promedio ---> 0.94
Первая последовательность, XX-XXXXXX - это идентификационный номер ссуды. Дата и следующие два числа не важны. «36» - количество платежей. Следующая последовательность положительных и отрицательных чисел показывает, насколько поздно / рано был этот клиент для этого кредита в каждый из 36 периодов оплаты. «0,94», следующее за «Atraso Promedio», является расчетом банка для средней задержки. Проблема в том, что это неправильно, так как они заменяют все отрицательные (то есть досрочные) платежи в серии нулями, фактически подчеркивая, насколько рискован клиент. Мне нужно написать программу, которая извлекает ID и количество платежей, а затем динамически рассчитывает среднюю задержку в несколько строк.
Вот что у меня есть:
#Create an output file
open(OUT, ">out.csv");
print OUT "Loan_ID,Atraso_promedio,Atraso_alt,N_payments,\n";
open(MYINPUTFILE, "<DATA.txt");
while(<MYINPUTFILE>){
chomp($_);
if($ID_select != 1 && m/(\d{2}\-\d{6})/){$Loan_ID = $1, $ID_select = 1}
if($ID_select == 1 && m/\d{1,2},\d{1,3}\.00\s+\d{1,2},\d{1,3}\.00\s+(\d{1,2})/) {$N_payments = $1, $Payment_find = 1};
if($Payment_find == 1 && $ID_select == 1){
while(m/\s{2,}(\-?\d{1,3})/g){
$N++;
$SUM = $SUM + $1;
print OUT "$Loan_ID,$1\n"; #THIS SHOWS ME WHAT NUMBERS THE CODE IS GRABBING. ACTUAL OUTPUT WILL BE WRITTEN BELOW
print $Loan_ID,"\n";
}
if(m/---> *(\d*.\d*)/){$Atraso = $1, $Atraso_select = 1}
if($ID_select == 1 && $Payment_find == 1 && $Atraso_select == 1){
...
Это еще не все, но в цикле while происходит сбой программы. Проблема в модификаторе шаблона 'g', который выполняет глобальный поиск строки. Это заставляет программу получать номера, которые мне не нужны, например, «1» в идентификаторе ссуды и «36» для количества платежей. Мне нужно, чтобы цикл while начинался с того места, где прервалась предыдущая строка в коде, которая должна быть сразу после определения количества ссуд. Я перепробовал каждый модификатор шаблона, который мне удалось найти, и только «g» удерживает меня в бесконечном цикле. Мне нужно, чтобы цикл while шел до конца строки, а затем начинал со следующей, не прочесывая части строки, уже переданные через программу.
Мысли? Имеет ли это смысл? Был бы безмерно благодарен за любую помощь, которую вы можете предложить. Эта работа бесплатна, неоплачиваема: просто пытаюсь помочь друзьям в микрокредитном учреждении провести анализ рисков.
Приветствия
Аарон