LINUX.ORG.RU

Парсинг - как лучше сделать.


0

0

Второй день думаю, как получше справиться с задачей - есть текстовый файл вида

...
|давно 12121212 2323
+--------------------------------
|вчера 434374382 43
+--------------------------------
|сегодня 764 433
...

это алкогольный график^W^W отчетность по форме 101 из kliko. Я вот думаю, есть же универсальные способы парсить такие файлы(excel вполне замечательно импортит это чудо)? Пока нарисовал хитрую штукенцию на перле, которая с помощью регэкспов все это дело разбирает, а как правильнее?

lines_generator = (line.split() for line in source.splitlines() if line and not line.startswith('+'))

Нехитрая штукенция на питоне :)

anonymous
()
Ответ на: комментарий от nikolayd

Забей. Парсить эту дурь - себе дороже. Чуть позже поймёшь, что на самом деле этих форматов как грязи. У регионалов, например, вообще рандомно генерятся эти файлы. Я по-молодости тоже сделал парсер на перле, лопающий 5-6 форматов. Но потом на меня снизошло благо:

http://www.cbr.ru/credit/transparent.asp

Листаем да самого конца страницы и наблюдаем уже готовый .dbf :-)

Anoxemian ★★★★★
()
Ответ на: комментарий от nikolayd

Вот как-то примерно так:

perl -ne 'next if (m/^\+-*$/); print join "," (split " ", $_); ' < file.report > file.csv

Это можно загнать в csv, коотрый уже читается сотнями библиотек.

quarck
()
Ответ на: комментарий от quarck

сорры, еще надо первый символ прибить:

perl -ne 'next if (m/^\+-*$/); s/^.//; print join "," (split " ", $_); ' < file.report > file.csv

quarck
()

Вот откопал:

sub PT # ProcessTxt
{
	local @state = ("A","P"); # Active/Passive account
	local $fl    = 0;         # @state switch flag
	local $old   = 0;         # Previous value of $fl
	local $DATE  = $_[1]; 
	local $ID    = $_[2];
	local @vars  = ();

	open( FILE, $_[0] ) or print("Error: $!");
	while ( chomp( $_ = <FILE> ) )
	{
		s/([\|*]|[\s*])+/\|/gi; @vars = split( /\|/ );
		if ( $vars[1] > 80000 or not $vars[1] =~ /\d{5}/ ){ next; }
		( $old > $vars[1] ? $fl = 1 : ( $old = $vars[1] and $fl = 0 ) ); 

		switch( scalar( @vars ) )
		{
			case 15 { RS( $ID, $DATE, $state[$fl], @vars[1,3,4,6,7,9,10,12,13] ); }
			case 14 { RS( $ID, $DATE, $state[$fl], @vars[1,2,3,5,6,8,9 ,11,12] ); }
		}	
	}
	close( FILE );
	RS( $ID, $DATE, 'A', 80000, 0, 0, 0, 0, 0, 0, 0, 0 );
	RS( $ID, $DATE, 'P', 90000, 0, 0, 0, 0, 0, 0, 0, 0 );
}

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

>Чуть позже поймёшь, что на самом деле этих форматов как грязи. У регионалов, например, вообще рандомно генерятся эти файлы.

Ну да, некоторые присылают в экселе, а у регионалов просто недоклико.

> Листаем да самого конца страницы и наблюдаем уже готовый .dbf

Ага, а 134 и 135 откуда взять? Да и разбирать эту хрень надо до того, как она на сайте ЦБР появится :)

nikolayd
() автор топика
Ответ на: комментарий от nikolayd

> Ага, а 134 и 135 откуда взять? Да и разбирать эту хрень надо до того, как она на сайте ЦБР появится :)

134 и 135 не нужны. А по поводу временного лага: не сделай ты умный вид угрюмого аналитика и скажи, что анализ занимает много времени :-)

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

:)

>А по поводу временного лага: не сделай ты умный вид угрюмого аналитика и скажи, что анализ занимает много времени :-)

Тогда придет настоящий угрюмый аналитик и сделает мне сотрясение мозга.

> 134 и 135 не нужны.

Еще как нужны! Причем инековский ФРМ весь этот текстовый беспредел всасывает на одном дыхании

nikolayd
() автор топика
Ответ на: комментарий от nikolayd

> Причем инековский ФРМ весь этот текстовый беспредел всасывает на одном дыхании

А, ясно, ты не занимаешся анализом. Так вот повторяю: 134 и 135 формы не нужны. Уж для анализа финансового состояния совершенно точно.

Про ИНЕК вообще забудь. Этот говнософт работает по неведомым говноправилам. И умеет исключительно синтетику. То бишь к анализу этот говнопродукт имеет очень отдалённое отношение. Вобщем видимо именно из-за этого тебя и напрагли темой парсинга.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

> Уж для анализа финансового состояния совершенно точно.

Анализом не занимаюсь, но аналитикам эти формы(некоторые данные оттуда) нужны, абсолютно точно.

> Про ИНЕК вообще забудь. Этот говнософт работает по неведомым говноправилам. И умеет исключительно синтетику. То бишь к анализу этот говнопродукт имеет очень отдалённое отношение. Вобщем видимо именно из-за этого тебя и напрагли темой парсинга.

Про ИНЕК подписываюсь под каждой буквой. Он, собственно, как парсер сейчас и используется.

На самом деле, я хочу прикинуть как бы покошеренее такой парсер нарисовать, и сколько это займет времени; вот перлоштуку два дня почти рисовал. Нужно это чтобы оценить насколько адекватное предложение выставили несколько аутсорсинговых контор, которые и будут решать проблему парсинга.

nikolayd
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.