This solution takes as its first argument the number of ways to split a file, and the remainder of arguments are taken to be files which need to be split. It does not delete the originals.
#!/usr/bin/perl -w
use strict; ### a must
my $parts = shift; ### how many parts to split
my @file = @ARGV; ### the files to split
foreach ( @file ) {
### how big should the new file be?
my $size = -s $_;
my $buf_size = $size / $parts;
### ready a buffer for the data
my $buf = '';
### open the input file
open ( In, $_ ) ||
warn "Cannot read $_: $!\n";
binmode ( In );
### for as many parts as there are, read
### the amount of data, then write it to
### the appropriate output file.
for ( my $i = 0; $i < $parts; $i++ ) {
### read an output file worth of data
read ( In, $buf, $buf_size ) ||
warn "Read zero bytes from $_!\n";
### write the output file
open ( Out, "> $_$i" ) ||
warn "Cannot write to $_$i: $!\n";
print Out $buf;
### if this is the last segment,
### grab the remainder
if ( $i == ( $parts - 1 ) ) {
my $rem = $size % $buf_size;
if( $rem ) {
read ( In, $buf, $rem ) ||
warn "Read zero bytes from $_!\n";
print Out $buf;
}
}
### we are done with the current output file
close ( Out );
}
### we're done spliting the input file
close ( In );
}
exit;
Its weakness is it only loads one buffer per
output segment, and for greater usability it
should probably loop if it's a huge size. I don't see this being a huge problem given
the nature of the program, though, because
there's some place the split files are going that's too small for the original file, so
the parts should be small enough for main
memory. I'll therefore leave more exotic
buffer manipulation as an exercise.
Chris
Boo!
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.