I have a lot of text files with fixed-width fields:
<c> <c> <c>
Dave Thomas 123 Main
Dan Anderson 456 Center
Wilma Rainbow 789 Street
The rest of the files are in a similar format, where the <c> will mark the beginning of a column, but they have various (unknown) column & space widths. What’s the best way to parse these files?
I tried using Text::CSV, but since there’s no delimiter it’s hard to get a consistent result (unless I’m using the module wrong):
my $csv = Text::CSV->new();
$csv->sep_char (' ');
while (<FILE>){
if ($csv->parse($_)) {
my @columns=$csv->fields();
print $columns[1] . "\n";
}
}
As user604939 mentions,
unpackis the tool to use for fixed width fields. However,unpackneeds to be passed a template to work with. Since you say your fields can change width, the solution is to build this template from the first line of your file:which prints:
template: A8 A10 A* $VAR1 = [ [ 'Dave', 'Thomas', '123 Main' ], [ 'Dan', 'Anderson', '456 Center' ], [ 'Wilma', 'Rainbow', '789 Street' ] ];