我目前有一个带有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 :(得分: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:// memory”代替“php:// temp” - 区别在于“内存”仅将内容存储在内存中,而“temp”将存储内容内存直到达到给定大小(默认值为2 MB),然后透明地切换到文件系统。
答案 1 :(得分: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;
}