Perl RegEx для соответствия 11 столбцов файла - PullRequest
0 голосов
/ 10 августа 2010

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

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

Ответы [ 4 ]

1 голос
/ 11 августа 2010

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

    @fields = split /\t/, $line;
    if (@fields == 11) {  # less than 11 fields is probably header/footer
        $the_5th_column = $fields[4];
        ...
    }
1 голос
/ 11 августа 2010

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

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

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

1 голос
/ 11 августа 2010

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

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

0 голосов
/ 11 августа 2010

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

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

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

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

Обновление:

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

                                                     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, что заставило меня подумать, что какой-то придурок загрузил свою электронную таблицу или отчет в свой текстовый процессор и затем сохранил ее. Чтение - это двухэтапный процесс избавления от переноса возврата каретки, а затем повторная обработка данных для анализа столбцов. В качестве дополнительной задачи у них также есть заголовки столбцов в данных для разрывов страниц.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...