Моя первая мысль заключается в том, что данные примера ужасно искажены в вашем примере. Было бы здорово увидеть, что он встроен в теги <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% проанализированных файлов, однако вы, вероятно, захотите сделать это с помощью пары различных методов синтаксического анализа из-за использования вкладок и пустых строк и встроенных заголовков столбцов.
А, удовольствие от обработки данных из пустыни.
Регулярные выражения не являются единственным инструментом в панели инструментов. Попробуйте еще один молоток. – Ether
Как данные в настоящее время разделены? Вкладки? Нерегулярное количество пробелов? –
«Я пытаюсь написать perl regex» - подходящая цитата для случая, конечно, «И теперь у вас есть две проблемы». Аминь к тому, что сказал Эфир. – DVK