Small tweaks to the example code I posted earlier accommodates the "real" file format:
use strict; use warnings; my $fileStr = <<STR; Property job 1 : Activity coefficients ln(gamma) ; Settings job 1 : T= 298.15 K ; x(6)= 1.0000 ; Units job 1 : Concentrations x : mole fraction ; Nr Compound ln(gamma) 1 F002 4.66656083 2 F011 26.13597035 3 F101 32.47411476 4 F11-1 29.58963453 5 F111 30.24092207 6 h2o 0.00000000 7 acetonitrile 2.14102090 8 chlorobenzene 8.72282917 9 chcl3 6.98143674 10 cyclohexane 10.20251798 11 1,2-dichloroethane 6.32324557 12 ch2cl2 5.50767091 13 1,2-dimethoxyethane 2.56706253 14 n,n-dimethylacetamide -1.64673734 Property job 2 : Activity coefficients ln(gamma) ; Settings job 2 : T= 298.15 K ; x(7)= 1.0000 ; Units job 2 : Concentrations x : mole fraction ; Nr Compound ln(gamma) 1 F002 1.69945785 2 F011 0.74578421 3 F101 2.67268035 4 F11-1 1.64808218 5 F111 1.95840198 6 h2o 2.08530828 7 acetonitrile 0.00000000 8 chlorobenzene 1.08379112 9 chcl3 0.46576330 10 cyclohexane 3.71606919 11 1,2-dichloroethane -0.02354847 12 ch2cl2 -0.23798262 13 1,2-dimethoxyethane 1.22044280 14 n,n-dimethylacetamide 0.44524110 STR open my $fIn, '<', \$fileStr or die "Couldn't open \$fileStr: $!\n"; # Look for the empty line between records local $/ = "Nr Compound"; while (defined (my $record = <$fIn>)) { my @lines = grep {/^\s*\d+\s+\S+\s+-?\d+\.\d+/} split "\n", $recor +d; next if !@lines; my %recordData = map{/\d+\s+(\S+)\s+(\S+)/; ($1, $2)} @lines; my @solvents = grep {!/^F\d+/} keys %recordData; my @fractions = grep {/^F\d+/} keys %recordData; my ($zeroSolvent) = grep {0.0 == $recordData{$_}} @solvents; print "${zeroSolvent}_$_ => $recordData{$_}\n" for @fractions; }
Prints:
h2o_F101 => 32.47411476 h2o_F011 => 26.13597035 h2o_F002 => 4.66656083 h2o_F11-1 => 29.58963453 h2o_F111 => 30.24092207 acetonitrile_F111 => 1.95840198 acetonitrile_F101 => 2.67268035 acetonitrile_F11-1 => 1.64808218 acetonitrile_F002 => 1.69945785 acetonitrile_F011 => 0.74578421
The key differences are choosing a different string to recognize records and only keeping interesting lines for processing from each record.
In reply to Re: Help with parsing a file
by GrandFather
in thread Help with parsing a file
by Odar
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |