2011-12-08 6 views
0

私は現在、csvファイルを受け取り、そこからデータの配列を返す関数を持っています。私は、ファイル自体の代わりにファイルデータを取るために、この関数を最小限に変更したいと思います。ファイルデータからリソースハンドルを取得できますか?

次のコードを使用して、ファイルからではなく、渡されたデータからリソースハンドルを取得して、残りの関数を同じにすることができます。これは可能ですか?

public function returnRawCSVData($filepath, $separator = ',') 
{ 
    $file = fopen($filepath, 'r'); 
    $csvrawdata = array(); 

    //I WANT TO CHANGE $filepath to $file_data and get a resource from it to pass into fgetcsv below. 

    while(($row = fgetcsv($file, $this->max_row_size, $separator, $this->enclosure)) != false) {    
     if($row[0] != null) { // skip empty lines 

     } 
    } 

    fclose($file); 
    return $csvrawdata; 
} 
+0

私はあなたが単にあなた*のreturnRawCSVDataを作るために探していることを正しく理解Amは()*関数は、引数として、既に開いているファイルのリソースハンドルを受け入れますか?または、returnRawCSVData()*に渡したいCSVソーステキストからリソースを生成しようとしていますか? – rdlowrey

+0

@rdlowrey 2番目のファイル – Metropolis

答えて

2

あなたがソースから新しいファイルリソースを作成する方法を探しているようですテキスト?

もしそうなら、あなたはそのように、メモリファイルリソースを作成することができます

/** 
* Return an in-memory file resource handle from source text 
* @param string $csvtxt CSV source text 
* @return resource File resource handle 
*/ 
public static function getFileResourceFromSrcTxt($csvtxt) 
{ 
    $tmp_handle = fopen('php://temp', 'r+'); 
    fwrite($tmp_handle, $csvtxt); 
    return $tmp_handle; 
} 

/** 
* Parse csv data from source text 
* @param $file_data CSV source text 
* @see self::getFileResourceFromSrcTxt 
*/ 
public function returnRawCSVData($file_data, $separator = ',') 
{ 
    $file = self::getFileResourceFromSrcTxt($file_data); 
    $csvrawdata = array(); 

    while(($row = fgetcsv($file, $this->max_row_size, $separator, $this->enclosure)) != false) {    
    if($row[0] != null) { // skip empty lines 
     // do stuff 
    } 
    } 

    fclose($file); 
} 

それはあなたにも使用できることは注目に値します「PHPを://メモリ」PHP」の代わりに://一時違いは 'メモリ'は物事をメモリに保存するだけで、 'temp'は指定されたサイズ(デフォルトは2MB)に達するまで何かをメモリに保存してから、ファイルシステムに透過的に切り替えます。

what the php docs say on this topicの詳細をご覧ください...

+0

これは基本的に、ファイルデータを取得し、一時ファイルを作成し、それにハンドルを取得するのと同じですか?それは私がそれをやろうと考えていたのとは別のやり方でしたが、どんな種類のファイル作成も避けようとしていました。しかし、あなたの解決策は一時的なものになって以来、より良いものになっています。 – Metropolis

+0

右 - このようにファイルシステムに触れることは決してありません。一時データをディスクに保存してから削除するよりもはるかにクリーンな方法です。 – rdlowrey

+0

恐ろしい、ありがとう! – Metropolis

0

あなたはファイルハンドル周りを通過しようとしている場合、あなたはそのように扱うことができますが:

$in_file = fopen('some_file.csv', 'r'); 
// Do stuff with input... 

// Later, pass the file handle to a function and let it read from the file too. 
$data = doStuffWithFile($in_file); 

fclose($in_file); 


function doStuffWithFile($file_handle) 
{ 
    $line = fgetcsv($file_handle); 
    return $line; 
} 
+0

私はファイルからのデータを持っているので、ハンドルを渡すことはできません。オリジナルの機能とは違います。 – Metropolis

関連する問題