#In this example, the 13 digit bill numbers are right after the date (20061212), eg. 123456789A101, C234567891011, A001122334455. The header line starts with 101010000 and bill details line starts with 301033000. The end of bill details line is identified by 999999. 101010000ABC 20060212123456789A1018880001000000001 123456789A10100216 4322489239649 342 10 00000 20060212 105060000ABC 20060212123456789A1018880001000000002 ADDRESS 0 107660000ABC 20060212123456789A1018880001000000003 ADDRESS LINE 2 20 108250100ABC 20060212123456789A1018880001000000004 123456789A10100216 109300100ABC 20060212123456789A1018880001000000005 303-0 0 101250100ABC 20060212123456789A1018880001000000006 IUSER@MAIL.DOMAIN.COM 108430100ABC 20060212123456789A1018880001000000008 00000 123456789A10100216 0000000840M0000000000{0000000000{0000000000{0000000000{0000000000{0000000840M 0000000000{ 100550000ABC 20060212123456789A1018880001000000009 123456789A10100216 NC2005110920051208200512090000000000{0000000000{0000000000{0000000000{0000000000{0000000000{0000000000{000000000520 100610000ABC 20060212123456789A1018880001000000010 123456789A10100216 NC0000000000{0000000000{0000000000{0000000000{0000000000{0000000000{0000000000{0000000000{0000000000{0000000840M0000 520 102210000ABC 20060212123456789A1018880001000000011 * * * REVISED FINAL BILL MESSAGE * * * THIS REVISED FINAL BILL INCLUDES CHARGES OR CREDITS NOT PREVIOUSLY 104500000ABC 20060212123456789A1018880001000000012 APPLIED TO YOUR ACCOUNT. A SUMMARY IS PROVIDED ON ANOTHER PAGE OF THIS BILL. ANY CREDITS DUE YOU ARE REFLECTED ON THIS BILL. 102250000ABC 20060212123456789A1018880001000000013 SHOULD YOU HAVE ANY QUESTIONS CONCERNING YOUR ACCOUNT, CONTACT 101250100ABC 20060212123456789A1018880001000000014 YOUR CUSTOMER SERVICE CENTER 105500000ABC 20060212123456789A1018880001000000015 THANK YOU FOR THE OPPORTUNITY TO SERVE YOU. 108456100ABC 20060212123456789A1018880001000000016 123456789A10100216 0000000840M0000000000{0000000000{0000000840M 107208000ABC 20060212123456789A1018880001000000017 0000000840M 109080000ABC 20060212123456789A1018880001000000018 200602120000000000600000000005000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000 102098100ABC 20060212123456789A1018880001000000019 200602124322489239649 1 00000 109990000ABC 20060212123456789A1018880001000000020 N10 NC0470 0 101010000ABC 20060212C2345678910118880003000000021 C23456789101100114 40002416789 3939 20U 00000 20060114 105060000ABC 20060212C2345678910118880003000000022 ADDRESS 105060000ABC 20060212C2345678910118880003000000023 ADDRESS LINE 2 107660000ABC 20060212C2345678910118880003000000024 C23456789101100114 109080000ABC 20060212C2345678910118880003000000025 IUSER@MAIL.DOMAIN.COM 109990000ABC 20060212C2345678910118880003000000026 C23456789101100114 301033000ABC 20060212123456789A1018880002000000001 200602124322489000000 306020100ABC 20060212123456789A1018880002000000002 400 306020100ABC 20060212123456789A1018880002000000003 1 306020100ABC 20060212123456789A1018880002000000005 1 CUSTOMER NAME ABBREVIATION 306020100ABC 20060212123456789A1018880002000000006 1 CUSTOMER TERMINAL LOCATION 306020100ABC 20060212123456789A1018880002000000007 1 CUSTOMER'S CARRIER NAME ABBREVIATION 306020100ABC 20060212123456789A1018880002000000008 1 AREA IDENTIFICATION 306020100ABC 20060212123456789A1018880002000000009 1TAR TAX AREA 309990000ABC 20060212123456789A1018880002000000010 1TAX TAX APPLICATION 999999 200602121635 30 301033000ABC 20060212C2345678910118880001000000001 200601164322489000000 306020100ABC 20060212C2345678910118880001000000002 306020100ABC 20060212C2345678910118880001000000003 1 306020100ABC 20060212C2345678910118880001000000004 1 CUSTOMER NAME ABBREVIATION 306020100ABC 20060212C2345678910118880001000000005 1 CUSTOMER TERMINAL LOCATION 306020100ABC 20060212C2345678910118880001000000006 1 CUSTOMER'S CARRIER NAME ABBREVIATION 306020100ABC 20060212C2345678910118880001000000007 1 AREA IDENTIFICATION 306020100ABC 20060212C2345678910118880001000000008 1TAR TAX AREA 309990000ABC 20060212C2345678910118880001000000009 1TAX TAX APPLICATION 999999 200601161635 30 #Sometimes, the data can also look like this or any other variation 101010000Z98765420060212A0011223344558880001000000001 123456789A10100216 4322489239649 3424 10N 00000 20060212 105060000Z98765420060212A0011223344558880001000000002 ADDRESS 0 107660000Z98765420060212A0011223344558880001000000003 ADDRESS LINE 2 20 108250100Z98765420060212A0011223344558880001000000004 123456789A10100216 109300100Z98765420060212A0011223344558880001000000005 343-0 0 101250100Z98765420060212A0011223344558880001000000006 IUSER@MAIL.DOMAIN.COM 108430100Z98765420060212A0011223344558880001000000008 00000 R49431957005313 0000000840M0000000000 301033000Z98765420060212A0011223344558880001000000001 200601164322489000000 306020100Z98765420060212A0011223344558880001000000002 306020100Z98765420060212A0011223344558880001000000003 1 306020100Z98765420060212A0011223344558880001000000004 1 CUST NAME 306020100Z98765420060212A0011223344558880001000000005 1 CUSTOMER LOC 306020100Z98765420060212A0011223344558880001000000006 1 CUSTOMER'S ABBREVIATION 306020100Z98765420060212A0011223344558880001000000007 1 AREA IDENTIFICATION 306020100Z98765420060212A0011223344558880001000000008 1TAR TAX AREA 309990000Z98765420060212A0011223344558880001000000009 1TAX TAX APPLICATION 999999 200601161635 30 #### use warnings; use strict; use diagnostics; my %bills; my $currBill = 'void'; my $type = 'header'; $datafile = "datafile.txt"; open(DATA, $datafile) || die ("Cannot open $datafile: $!"); while () { chomp; if ($_ =~ /^101010000/) { $currBill = $1; $type = 'header'; } elsif ($_ =~ /^301033000/) { $currBill = $1; $type = 'data'; } else { push @{$bills{$currBill}{$type}}, $_; } } close(DATA); open($outputdata, '>', 'outputfile.txt' || die "Cannot open output file output.txt: $!"); for my $bill (sort keys %bills) { print $outputdata ">>>> $bill\n"; print $outputdata "Header\n" . (join "\n", @{$bills{$bill}{'header'}}) . "\n" if exists $bills{$bill}{'header'}; print $outputdata "Data\n" . (join "\n", @{$bills{$bill}{'data'}}) . "\n" if exists $bills{$bill}{'data'}; }