2011-12-08 77 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()*函数接受一个已经打开的文件资源句柄作为参数?或者你是否试图从您想要传入的* csv源文本生成资源* returnRawCSVData()*? – rdlowrey

+0

@rdlowrey第二个 – 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://温度“ - 不同之处在于”内存“只将内容存储在内存中,而”临时“将内存中的内容存储到内存中直到达到给定大小(默认值为2 MB),然后透明地切换到文件系统。

了解更多有关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