Monday, January 11, 2010

Recipe 1.12. Generating Fixed-Width Field Data Records










Recipe 1.12. Generating Fixed-Width Field Data Records



1.12.1. Problem


You need to format


data records such that each field takes up a set amount of characters.




1.12.2. Solution


Use pack( )
with a format string that specifies a sequence of
space-padded strings. Example 1-32 transforms an
array of data into fixed-width records.


Generating fixed-width field data records



<?php

$books = array( array('Elmer Gantry', 'Sinclair Lewis', 1927),
array('The Scarlatti Inheritance','Robert Ludlum',1971),
array('The Parsifal Mosaic','William Styron',1979) );

foreach ($books as $book) {
print pack('A25A15A4', $book[0], $book[1], $book[2]) . "\n";
}

?>






1.12.3. Discussion


The format string A25A14A4 tells pack( ) to transform its subsequent arguments into a 25-character space-padded string, a 14-character space-padded string, and a 4-character space-padded string. For space-padded fields in fixed-width records, pack( ) provides a concise solution.


To pad fields with something other than a space, however, use
substr( ) to ensure that the field values aren't too long and str_pad( ) to ensure that the field values aren't too short. Example 1-33 transforms an array of records into fixed-width records with .-padded fields.


Generating fixed-width field data records without pack( )



<?php

$books = array( array('Elmer Gantry', 'Sinclair Lewis', 1927),
array('The Scarlatti Inheritance','Robert Ludlum',1971),
array('The Parsifal Mosaic','William Styron',1979) );

foreach ($books as $book) {
$title = str_pad(substr($book[0], 0, 25), 25, '.');
$author = str_pad(substr($book[1], 0, 15), 15, '.');
$year = str_pad(substr($book[2], 0, 4), 4, '.');
print "$title$author$year\n";
}

?>






1.12.4. See Also


Documentation on pack( ) at http://www.php.net/pack and on str_pad( ) at http://www.php.net/str_pad. Recipe 1.16 discusses pack( ) format strings in more detail.













No comments: