in reply to Re^2: parse a file TXT similar to XML -- flip-flop operator
in thread RESOLVED - parse a file TXT similar to XML
UPDATE: I looked at this thing again and I think I see a possible interpretation error of your DATA on my part. I work with some XML formats and this idea of using a specific key to indicate the start or the end of the record is my opinion, ill advised. Usually XML keys usually are not guaranteed to come in a specific order. However usually there will be clear "end of record" indication. In some files I parse, that is "\n". Here I assumed just a blank line, or end of file.use strict; use warnings; use Data::Dumper; my @structure; my %temp; while (<DATA>) { next unless /\S/; # skip blank lines if (/^\.\.\./) # 3 dots ends a record { push (@structure, {%temp}); %temp=(); } else { chomp; my ($key, $value) = split /\s+=>\s+/,$_; $temp{$key}=$value; } } push (@structure, {%temp}) if (%temp); # possible last record print Dumper \@structure; =Output $VAR1 = [ { 'a' => '"premiere valeur"', 'objet' => 'debut1', 'index' => '1' }, { 'objet' => 'fin', 'z' => '"dernier mot"' }, { 'objet' => 'debut2', 'index' => '77', 'a' => '"autre valeur"' }, { 'z' => '"aurai-je le dernier mot ?"', 'objet' => 'fin' } ]; =cut __DATA__ objet => debut1 index => 1 a => "premiere valeur" ... z => "dernier mot" objet => fin ... objet => debut2 index => 77 a => "autre valeur" ... z => "aurai-je le dernier mot ?" objet => fin
so here is updated code:
use strict; use warnings; use Data::Dumper; my @structure; my %temp; while (<DATA>) { if (!/\S/) # blank line ends a record { push (@structure, {%temp}) if (%temp); # possible null record %temp=(); } else { chomp; my ($key, $value) = split /\s+=>\s+/,$_; $value =~ tr/"//d; # remove double quotes $temp{$key}=$value; } } push (@structure, {%temp}) if (%temp); # possible last record print Dumper \@structure; =Output $VAR1 = [ { 'a' => 'premiere valeur', 'b' => 'some value', 'index' => '1', 'z' => 'dernier mot', 'objet' => 'fin' }, { 'a' => 'autre valeur', 'index' => '77', 'objet' => 'fin', 'z' => 'aurai-je le dernier mot ?' } ]; =cut __DATA__ objet => debut index => 1 a => "premiere valeur" b => "some value" z => "dernier mot" objet => fin objet => debut index => 77 a => "autre valeur" z => "aurai-je le dernier mot ?" objet => fin
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: parse a file TXT similar to XML -- flip-flop operator
by x-lours (Sexton) on Mar 31, 2022 at 10:54 UTC |