是否可以从文件数据中获取资源句柄?

时间:2011-12-08 16:48:54

标签: php

我目前有一个带有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;
}

2 个答案:

答案 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),然后透明地切换到文件系统。

详细了解what the php docs say on this topic ...

答案 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;
}