Stream Filter

In php one can use filters with streams.  Sometimes it can become handy.  Let’s say you open a .csv file as a stream, but this file is tab separated.  Your program can can process coma separated csvs, but not tab separated.  This is a good use case for a stream filter, because it can make replacements on the fly.  Below is the code that shows how to create and use filter that replaces tabs with comas in the stream.

<?php
class TabFilter extends PHP_User_Filter
{
    private $_data;
 
    /* Called when the filter is initialized */
    function onCreate( )
    {
        $this->_data = '';
        return true;
    }
 
    /* This is where the actual stream data conversion takes place */
    public function filter($in, $out, &$consumed, $closing)
    {
 
        /* We read all the stream data and store it in 
           the '$_data' variable 
        */
        while($bucket = stream_bucket_make_writeable($in))
        {
            $this->_data .= $bucket->data;
            $this->bucket = $bucket;
            $consumed = 0;
        }
 
        /* Now that we have read all the data from the stream we process 
          it and save it again to the bucket.
        */
        if($closing)
        {
            $consumed += strlen($this->_data);
 
            $pattern = "/\t/";
            $str = preg_replace($pattern,
                                ",",
                                $this->_data);
 
            $this->bucket->data = $str;
            $this->bucket->datalen = strlen($this->_data);
 
            if(!empty($this->bucket->data)) {
                stream_bucket_append($out, $this->bucket);
            }
 
            return PSFS_PASS_ON;
        }
 
        return PSFS_FEED_ME;
    }
}
 
stream_filter_register('myFilter', 'URLFilter');
$handle = fopen("http://website.com/tab-delimited-csv", "r");
stream_filter_append($handle, "myFilter");