Анализ файла - Как определить конкретные строки, только если следующая строка содержит определенное слово - PullRequest
2 голосов
/ 12 марта 2019

У меня большой файл размером около 50 тыс. Строк.Мне нужно вводить данные из строки в БД, только если в следующей строке есть определенное слово.Например,

00:00:01   Request from 1.1.1.1 for A-record for www.website1.com
00:00:01   Sending reply to 1.1.1.1 about A-record for www.website1.com:
00:00:01   -> Answer: A-record for www.website1.com = 999.999.999.999
00:00:02   Request from 1.1.1.1 for A-record for www.website2.com
00:00:02   Plug-in "Domain Blacklist1" matched A-record for www.website2.com
00:00:03   Request from 1.1.1.1 for A-record for www.website3.com
00:00:04   Sending reply to 1.1.1.1 about A-record for www.website3.com:
00:00:01   -> Answer: A-record for www.website3.com = 888.888.888.888

Я хочу ввести данные только из 4-й строки, потому что в 5-й строке есть «Черный список доменов».

Есть какие-нибудь мысли о том, как я могу поступить об этом?

Пол

1 Ответ

2 голосов
/ 12 марта 2019

Используйте Файловые функции для циклического перемещения по файлу по одной строке за раз. Используйте отдельную переменную для отслеживания «предыдущей» строки (обновляя ее в конце каждой итерации). В цикле проверьте текущую строку на наличие магической фразы. Если он найден, добавьте предыдущую строковую переменную в массив результатов. Когда закончите, используйте массив строк по своему усмотрению.

<cfscript>
   matched = [];
   previousLine  = "";
   theFile  = fileOpen("c:/path/to/your/file.txt");

   try {
       while(!fileIsEOF(theFile))  {
           currentLine = fileReadLine(theFile);

           // if phrase is found in *this* line, store *previous* line 
           if (reFindNoCase("(Domain Blacklist)", currentLine)) {
               arrayAppend(matched, previousLine );
           }

           // update previous line
           previousLine  = currentLine;
       }
   }
   finally {
       theFile.close();
   }

   // do something with the results
   writeDump(var=matched, label="Matched Lines");
</cfscript>
...