2010-08-10 5 views
0

Я пытаюсь написать регулярное выражение perl для соответствия 5-му столбцу файлов, содержащим 11 столбцов. Также есть преамбула и нижний колонтитул, которые не являются данными. Любые хорошие мысли о том, как это сделать? Вот то, что я до сих пор:Perl RegEx для сопоставления 11 column File

if($line =~ m/\A.*\s(\b\w{9}\b)\s+(\b[\d,.]+\b)\s+(\b[\d,.sh]+\b)\s+.*/i) { 

И это то, что формы выглядит следующим образом:

 

    No. Form 13F File Number Name 

    ____ 28-________________ None 

    [Repeat as necessary.] 

          
FORM 13F INFORMATION TABLE 

        TITLE OF    VALUE SHRS OR SH /PUT/ INVESTMENT OTHER VOTING AUTHORITY 
    NAME OF INSURER  CLASS CUSSIP (X$1000) PRN AMT PRNCALL DISCRETION MANAGERS SOLE SHARED NONE 
Abbott Laboratories com 2824100 4,570 97,705 SH sole 97,705 0 0 
Allstate Corp com 20002101 12,882 448,398 SH sole 448,398 0 0 
American Express Co com 25816109 11,669 293,909 SH sole 293,909 0 0 
Apollo Group Inc com 37604105 8,286 195,106 SH sole 195,106 0 0 
Bank of America com 60505104 174 12,100 SH sole 12,100 0 0 
Baxter Internat'l Inc com 71813109 2,122 52,210 SH sole 52,210 0 0 
Becton Dickinson & Co com 75887109 8,216 121,506 SH sole 121,506 0 0 
Citigroup Inc com 172967101 13,514 3,594,141 SH sole 3,594,141 0 0 
Coca-Cola Co. com 191216100 318 6,345 SH sole 6,345 0 0 
Colgate Palmolive Co com 194162103 523 6,644 SH sole 6,644 0 0 

+0

Регулярные выражения не являются единственным инструментом в панели инструментов. Попробуйте еще один молоток. – Ether

+0

Как данные в настоящее время разделены? Вкладки? Нерегулярное количество пробелов? –

+0

«Я пытаюсь написать perl regex» - подходящая цитата для случая, конечно, «И теперь у вас есть две проблемы». Аминь к тому, что сказал Эфир. – DVK

ответ

1

Если вы когда-нибудь сделать, написать регулярное выражение это долго, вы должны по крайней мере использовать x флаг игнорировать пробелы, и важно разрешить пробелы и комментарии:

m/ 
    whatever 
    something else # actually trying to do this 
    blah    # for fringe case X 
    /xi 

Если вам трудно читать ваше собственное регулярное выражение, другие найдут его Невозможным.

+0

Это фантастическое предложение. Спасибо. – user341493

+0

У меня скрипт работает (и получить только несколько сотен документов, которые я не могу разобрать из нескольких тысяч). Этот совет был ключевым, потому что мне пришлось постоянно настраивать регулярное выражение для обработки миллионов случаев. Теперь анализируем следующий квартал :) Спасибо Бен. – user341493

1

Я думаю, что регулярное выражение является излишеством для этого.

Что бы я сделал, это очистить ввод и использовать файл Text::CSV_XS, указав разделитель записи (sep_char).

+0

К сожалению, для этой даты очень мало структуры, чтобы не было запятой или разделителем табуляции. Хотя, это может означать, что столбцы имеют фиксированную ширину ... – user341493

1

Как сказал Эфер, для этой работы будет подходящим другим инструментом.

@fields = split /\t/, $line; 
    if (@fields == 11) { # less than 11 fields is probably header/footer 
     $the_5th_column = $fields[4]; 
     ... 
    } 
+0

Ну, технически говоря, вы все еще находитесь в «и теперь у вас есть две проблемы». Территория - split использует регулярное выражение в отличие от правильного анализатора конечных автоматов, например Text :: CSV_XS :) Это не значит, что это не идеальное рабочее решение, заметьте :) – DVK

0

Моя первая мысль заключается в том, что данные примера ужасно искажены в вашем примере. Было бы здорово увидеть, что он встроен в теги <pre>...</pre>, поэтому столбцы будут сохранены.

Если вы имеете дело со столбчатыми данными, вы можете пойти после него с помощью substr() или unpack(), чтобы легче использовать регулярное выражение. Вы можете использовать регулярное выражение для анализа данных, но большинство из нас, кто программировал Perl, также узнали, что регулярное выражение не является первым инструментом, который захватывает много раз. Вот почему вы получили другие комментарии. Regex - мощное оружие, но легко стрелять в ногу.

http://perldoc.perl.org/functions/substr.html

http://perldoc.perl.org/functions/unpack.html

Update:

После немного совать вокруг на сайте SEC Edgar, я обнаружил, что файлы 13F красиво отформатирована. И вам не составит труда понять, как обрабатывать их с помощью substr и/или unpack.

 
                FORM 13F INFORMATION TABLE 
                  VALUE SHARES/ SH/ PUT/ INVSTMT OTHER   VOTING AUTHORITY 
NAME OF ISSUER     TITLE OF CLASS CUSIP  (x$1000) PRN AMT PRN CALL DSCRETN MANAGERS   SOLE SHARED  NONE 
- ------------------------------ ---------------- --------- -------- -------- --- ---- ------- ------------ -------- -------- -------- 
3M CO       COM    88579Y101  478  6051 SH  SOLE      6051  0  0 
ABBOTT LABS     COM    002824100  402  8596 SH  SOLE      8596  0  0 
AFLAC INC      COM    001055102  291  6815 SH  SOLE      6815  0  0 
ALCATEL-LUCENT     SPONSORED ADR 013904305  172 67524 SH  SOLE     67524  0  0

Если вы видите 13F файлы неформатированным, как в вашем примере, то вы не правильно читаете, потому что есть вкладки между столбцами в некоторых файлах.

Я просмотрел 68 файлов, чтобы получить представление о том, что там, а затем написал быструю процедуру распаковки на основе и получил это:

 
3M CO, COM, 88579Y101, 478, 6051, SH, , SOLE, , 6051, 0, 0 
ABBOTT LABS, COM, 002824100, 402, 8596, SH, , SOLE, , 8596, 0, 0 
AFLAC INC, COM, 001055102, 291, 6815, SH, , SOLE, , 6815, 0, 0 
ALCATEL-LUCENT, SPONSORED ADR, 013904305, 172, 67524, SH, , SOLE, , 67524, 0, 0 

Основываясь на некоторых других файлов Вот некоторые мысли о том, как обрабатывать их:

Некоторые файлы используют вкладки для разделения столбцов. Это тривиально для синтаксического анализа, и вы делаете не необходимо регулярное выражение для разделения столбцов. 0001031972-10-000004.txt выглядит так и выглядит очень похоже на ваш пример.

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

Другие используют пустую строку для разделения строк по вертикали, поэтому вам нужно пропустить пустые строки.

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

Некоторые используют выравнивание по центру листа колонки, в результате чего начальные и конечные пробелы в данных. s/^\s+//; и s/\s+$//; станут вашими друзьями.

наиболее интересным я видел, казалось, были созданы правильно, то слово -вкрывается в столбце 78, заставляя меня думать, что какой-то придурок загрузил свою электронную таблицу или отчитался в своем текстовом процессоре, а затем сохранил ее. p избавиться от возвратов каретки, а затем переработать данные для анализа столбцов. В качестве дополнительной задачи они также имеют заголовки столбцов в данных для разрывов страниц.

Вы должны иметь возможность получать 100% проанализированных файлов, однако вы, вероятно, захотите сделать это с помощью пары различных методов синтаксического анализа из-за использования вкладок и пустых строк и встроенных заголовков столбцов.

А, удовольствие от обработки данных из пустыни.

+0

«Моя первая мысль заключается в том, что данные примера ужасно искажены в вашем примере». К сожалению, данные выглядят так. Хуже того, это не только один файл; Я пытаюсь извлечь данные из каждой заявки 13F-HR, сделанной в SEC за последний год, и разные фирмы будут использовать различное форматирование. – user341493

+0

Как вы получаете доступ/получение информации? Через HTML? Причина, по которой я спрашиваю, заключается в том, что подача должна выглядеть так: http://moneywatch.bnet.com/money-library/sec-filings/c/2010/quarterly-reports/13f-hr/20100517/n53628664/?tag=content; col1 или http://www.secinfo.com/$/SEC/Filing.asp?T=vJcw.sc_1ut –

+0

Я занимаюсь подачей заявок из базы данных edg sec. Это неподдельные оригиналы. – user341493

Смежные вопросы