- Преобразовать структурированный файл в хеш, XAnder, 17:04 , 09-Мрт-16 (1) +1
> Вопрос: > каким образом распарсить такого рода таблицу, чтобы на выходе получить Perl хэш вида: В чём конкретно трудности? На первый взгляд задача несложная.
- Преобразовать структурированный файл в хеш, Pahanivo, 19:40 , 09-Мрт-16 (2)
1) Ээээ не совсем понятно - получить КОД инициализации хеша, или таки загнать данные в хэш? 2) Зачем использовать хэш для чистого вида двумерного массива??? 3) парсить как то так /^|\s*(\S+)\s*|\s*(\S+)\s*.... возможно палки нужно заэкранить, не помню, далее $1, $2 ..... ну или кромсать построчно в цикле. 4) вот с титулом повеселей, да и вероятно при таком подходе в теле таблицы могут тоже попадаться многостроки ...
- Преобразовать структурированный файл в хеш, XAnder, 21:27 , 09-Мрт-16 (3)
> 1) Ээээ не совсем понятно - получить КОД инициализации хеша, или таки загнать данные в хэш?Судя по всему, ТС имел в виду массив хешей. > 2) Зачем использовать хэш для чистого вида двумерного массива??? Там на самом деле массив записей или структур, то есть поля имеют разную природу, более-менее фиксированное количество, а порядок их не важен. Для этих дел в Перле традиционно используют хеши как наиболее выразительное (из имеющихся) средство. > 3) парсить как то так /^|\s*(\S+)\s*|\s*(\S+)\s*.... возможно палки нужно заэкранить, не помню, далее $1, $2 ..... ну или кромсать построчно в цикле. Всё так. Вариантов много можно придумать. Например, можно вспомнить про модификатор /g: map {...тут разбираем, что наловили...} m/\|\s*([^|]+)/g
> 4) вот с титулом повеселей, да и вероятно при таком подходе в теле таблицы могут тоже попадаться многостроки ... Да, это единственное нетривиальное место в этой задаче. Но тоже просто: цикл по строкам заголовка и сцепка отловленного на одинаковых позициях. На выходе имеем массив заголовков, его элементы потом используем как ключи хеша. А вот в теле многостроки никак, или нужно вводить дополнительный синтаксис.
- Преобразовать структурированный файл в хеш, Pahanivo, 09:52 , 10-Мрт-16 (5)
> Там на самом деле массив записей или структур, то есть поля имеют > разную природу, более-менее фиксированное количество, а порядок их не важен. Для > этих дел в Перле традиционно используют хеши как наиболее выразительное (из > имеющихся) средство.Ты прикалываешь что ли? Под таблицу использовать хеш? Какие тут структуры? Какая разная природа? Перлу вообще на типизацию пофигу. Тут массив двумерный идеален (можно сделать многострок в виде третьего измерения).
- Преобразовать структурированный файл в хеш, XAnder, 12:57 , 10-Мрт-16 (6)
> Ты прикалываешь что ли? Под таблицу использовать хеш? Какие тут структуры? > Какая разная природа? Перлу вообще на типизацию пофигу. > Тут массив двумерный идеален (можно сделать многострок в виде третьего измерения).Согласен. Я же только про выразительность писал, лёгкость восприятия человеком. $a->{Age} - сразу понятно, что это, а вот $a->[3] - не сразу. Да, во многих случаях такая выразительность не нужна.
- Преобразовать структурированный файл в хеш, ACCA, 01:24 , 10-Мрт-16 (4)
Ну, я бы как-то вот так сказал:
#!/usr/bin/perluse warnings; use strict; use Data::Dumper; my (@row,@header,@result, $i,$hdr); while (<main::DATA>) { s/^\|\s|[\s\|]+\s*$//go; if (/^\+-.+\+$/ && !$hdr .. /^\+-.+\+$/ && $hdr) { if (/^\+/) { if ($hdr) { foreach ($i=0; $i<= $#header; $i++) { $header[$i] = join ' ',@{$header[$i]}; } } $hdr=1; next; } @row = split /\s+\|\s+/,$_; for ($i=0;$i<= $#row;$i++) { push @{$header[$i]},$row[$i] if $row[$i]; } next; } last if /^\+-/; $i={}; @{$i}{@header} = split /\s+\|\s+/,$_; push @result, $i; } print Dumper \@result; __DATA__ +------------------+----------+--------+------+-----+ | Name | Current | Office | Age | ... | | | Position | City | | | +------------------+----------+--------+------+-----+ | Vasiliy_Petrov | student | n/a | 30 | ... | | Petr_Ivanov | worker | MSK | 40 | ... | | Ivan_Ivanov | n/a | SPB | 20 | ... | | ... | ... | ... | ... | ... | +------------------+----------+--------+------+-----+
|