2014-10-30 5 views
0

Вход:Как я могу форматировать каждую строку при чтении файла? Формат

2014-09-21 00:09:22,718 TRACE [user: admin12] common.Log (PerformanceExtractor.Python:9776) - ClientId:895,UserId:258,Ip:111.1.1.1,DurationMls:23,DurationString:0.023 seconds,Url:Calculate.LoanExmple 

Мой выход был бы в переменные; например:

$date = 2014-09-21 00:09:22,718 $user = admin12 $ClientId= 895 $UserID=258 $ip = 111.1.1.1 $time=0.023 $url=Calculate.LoanExmple 

В JAVA Я бы занялся этим, используя цикл, объект Stream и регулярное выражение. Я не знаю, как это сделать с помощью Perl. Я также добавлю эту переменную в виде столбца в базу данных, и линия будет составлять как минимум 3000 макс. 5000 каждый раз, когда я запустим .pl.

мой цикл

{ 
print $line; 

--formatting here? 

last if $. == 500; 

} 

Это просто выводит строку, как описано выше, - я полагаю, что лучшим решением было бы отформатировать его и получить значения в переменные, читая каждую строку, готовый для вставки в БД с Библиотеки DBI.

любые предложения?

+1

Вы хотите форматировать строки (то есть напечатать их каким-то образом), или вы хотите, чтобы * разобрать * строки - извлечь данные в переменных, а затем сохранить его? –

ответ

0

Что-то вроде этого?

while (<$fh>) { 
    my @fields = m{^ 
     (\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:[\d,]+) 
     \s TRACE \s 
     \[user:\s(\w+)] 
     \s common.Log \s \(PerformanceExtractor\.Python\:\d+\) \s - \s 
     ClientId:(\d+), 
     UserId:(\d+), 
     Ip:([\d.]+), 
     DurationMls:\d+, 
     DurationString:([\d.]+) \s seconds, 
     Url:(\S+) 
    $}x 
     or next; # skip lines which don't match regexp 

    printf('$date=%s; $user=%s; $client_id=%s; $user_id=%s; $ip=%s; $time=%s; $url=%s', @fields); 
    print "\n"; 
} 
+0

my $ file = 'C: \ Users \ text.txt'; while (<$fh>) { my @fields = m {^ (\ d {4} - \ d {2} - \ d {2} \ s \ d {2}: \ d {2}: [\ d ,] +) \ s TRACE \ s \ [пользователь: \ s (\ w +)] \ s common.Log \ s \ (PerformanceExtractor \ .Python \: \ d + \) \ s - \ s ClientId: (\ d +), UserId: (\ d +), Ip: ([\ д.] +), DurationMls: \ д + DurationString: ([. \ д] +) \ S секунд, Url :(\ S +) $} x или следующий; # пропустить строки, которые не соответствуют regexp printf ('$ date =% s; $ user =% s; $ client_id =% s; $ user_id =% s; $ ip =% s; $ time =% s; $ url =% s ', @fields); } проверено, но не работает :( – HashGuy81

+0

Вам нужно открыть файл. Если '$ file' - это имя файла, и вы хотите' $ fh' быть дескриптором файла, тогда: 'open my $ fh, << , $ file или die "Не удалось открыть $ file для ввода: $!"; ' – tobyink

+0

yep вы были правы - теперь я буду играть с ним, и мне нужно будет понять, как обрабатывать строки, которые находятся в другом формате, например insteead TRACE у меня будет INFO - иногда идентификаторы userid и clinet не регистрируются, и вместо этого у меня есть текстовая строка, относящаяся к операторам SQL, но я думаю, что этот RegEx откроет путь к славе - он настолько мощный PERL :) – HashGuy81