in reply to Split file based on field

This is wether short nor elegant, but works:
use strict; use warnings; my $header = <DATA>; my %handles; while ( <DATA> ) { my $handle; my $key = substr($_,0,13); # check if file is already open if ( $handles{$key} ) { $handle = $handles{$key}; } else { #if not, open it and store the handle my $name = $key; $name =~ s/://; open $handle, ">$name.txt" or die $!; print $handle $header; $handles{$key} = $handle; } print $handle $_; } __DATA__ Usr1369***12556 06-01-0101:00 1169 <snipped off> 06-01-0101:00 2396 <snipped off> 06-01-0103:12 1169 <snipped off> 06-01-0103:12 2569 <snipped off> 06-01-0301:00 1169 <snipped off> 06-01-0301:00 2396 <snipped off>


holli, /regexed monk/

Replies are listed 'Best First'.
Re^2: Split file based on field
by blazar (Canon) on Jan 10, 2006 at 13:40 UTC

    Although both the subject and the description of the problem may suggest that he's after something like the code you suggest, I don't think he really wants to split his input into several different files. I think it's more reasonable to assume he's after something along the lines of:

    #!/usr/bin/perl use strict; use warnings; $\ = $, = "\n"; chomp(my $head=<>); my ($last,@buffer); while (<>) { chomp; my $time = (split)[0]; if ( $time eq ($last ||= $time) ) { push @buffer, $_; } else { print $head, @buffer; ($last,@buffer)=($time,$_); } } print $head, @buffer; __END__

    Note that this assumes the input is ordered, which seems reasonable too, if you read the description carefully. Of course I do not claim it to be the cleanest or smartest way to do it, either.