Porto

Convert Fixed Width File To CSV

Convert Fixed Width File To CSV

This class provides a quick and simple method of converting fixed width files into CSV. It makes use of the SplFileObject to do the iterations, making it very efficient as an iterator knows only the current member. Options are provided to specify the end of line character and field delimiter. This class is especially useful if data needs to come from a fixed width file, and inserted into a database, as most databases support the importation of data from CSV files.

A handy feature of this class is the ability to skip fields if they are not required in output. The fields array supplied, provides a key/value pair, with the key holding the value of the offset, or start position of the field, and the value containing the width, or length of the field. For example. 12=>10 is a field that begins at position 12 and the width or length of the field is 10 characters.

The end-of-line character defaults to "\n" but can be set to any character.

The delimiter character defaults to a comma , but can be set to any character, or characters.

Output from the file may be used directly, written to a file, inserted into a database or any other purpose.


<?php

/**
 * Class to convert fixed width files into CSV format
 * Allows to set fields, separator, and end-of-line character
 *
 * @author Kevin Waterson
 * @url http://phpro.org
 * @version $Id$
 *
 */
class fixed2CSV extends SplFileObject
{
    
/**
    *
    * Constructor, duh, calls the parent constructor
    *
    * @access       public
    * @param    string  The full path to the file to be converted
    *
    */
    
public function __construct$filename )
    {
        
parent::__construct$filename );
    }

    
/*
    * Settor, is called when trying to assign a value to non-existing property
    *
    * @access    public
    * @param    string    $name    The name of the property to set
    * @param    mixed    $value    The value of the property
    * @throw    Excption if property is not able to be set
    *
    */
    
public function __set$name$value )
    {
        switch( 
$name )
        {
            case 
'eol':
            case 
'fields':
            case 
'separator':
            
$this->$name $value;
            break;

            default:
            throw new 
Exception("Unable to set $name");
        }
    }

    
/**
    *
    * Gettor This is called when trying to access a non-existing property
    *
    * @access    public
    * @param    string    $name    The name of the property
    * @throw    Exception if proplerty cannot be set
    * @return    string
    *
    */
    
public function __get$name )
    {
        switch( 
$name )
        {
            case 
'eol':
            return 
"\n";

            case 
'fields':
            return array();

            case 
'separator':
            return 
',';

            default:
            throw new 
Exception("$name cannot be set");
        }
    }
        
    
/**
    *
    * Over ride the parent current method and convert the lines
    *
    * @access    public
    * @return    string    The line as a CSV representation of the fixed width line, false otherwise
    *
    */
    
public function current()
    {
        if( 
parent::current() )
        {
            
$csv '';
            
$fields = new cachingIterator( new ArrayIterator$this->fields ) );
            foreach( 
$fields as $f )
            {
                
$csv .= trimsubstrparent::current(), $fields->key(), $fields->current()  ) );
                
$csv .= $fields->hasNext() ? $this->separator $this->eol;
            }
            return 
$csv;
        }
        return 
false;
    }
// end of class

?>

Example Usage


<?php

try
{
    
/*** the fixed width file to convert ***/
    
$file = new fixed2CSV'my_file.txt' );

    
/*** The start position=>width of each field ***/
    
$file->fields = array(0=>1010=>1525=>2045=>25);

    
/*** output the converted lines ***/
    
foreach( $file as $line )
    {
        echo 
$line;
    }

    
/*** a new instance ***/
    
$new = new fixed2CSV'my_file.txt' );

    
/*** get only first and third fields ***/
    
$new->fields = array(0=>1025=>20);

    
/*** output only the first and third fields ***/
    
foreach( $new as $line )
    {
        echo 
$line;
    }
    
}
catch( 
Exception $e )
{
    echo 
$e->getMessage();
}

?>