Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Help with parsing a file

by GrandFather (Saint)
on May 31, 2022 at 03:14 UTC ( [id://11144307]=note: print w/replies, xml ) Need Help??


in reply to Help with parsing a file

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.

Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond

Replies are listed 'Best First'.
Re^2: Help with parsing a file
by Odar (Novice) on May 31, 2022 at 21:31 UTC

    Thank you very much GrandFather, works like a charm!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11144307]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2024-04-18 06:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found