Search code examples
perlparsingfixed-width

How to parse multiple line, fixed-width file in perl?


I have a file that I need to parse in the following format. (All delimiters are spaces):

field name 1:            Multiple word value.
field name 2:            Multiple word value along
                         with multiple lines.
field name 3:            Another multiple word
                         and multiple line value.

I am familiar with how to parse a single line fixed-width file, but am stumped with how to handle multiple lines.


Solution

  • #!/usr/bin/env perl
    
    use strict; use warnings;
    
    my (%fields, $current_field);
    
    while (my $line = <DATA>) {
        next unless $line =~ /\S/;
    
        if ($line =~ /^ \s+ ( \S .+ )/x) {
            if (defined $current_field) {
                $fields{ $current_field} .= $1;
            }
        }
        elsif ($line =~ /^(.+?) : \s+ (.+) \s+/x ) {
            $current_field = $1;
            $fields{ $current_field } = $2;
        }
    }
    
    use Data::Dumper;
    print Dumper \%fields;
    
    __DATA__
    field name 1:            Multiple word value.
    field name 2:            Multiple word value along
                             with multiple lines.
    field name 3:            Another multiple word
                             and multiple line value.