如何在 Controller 中将 CSV 文件内容显示为数组?

How to Display CSV file content in Controller as an Array?

我正在尝试使用 Zend Framework 2 将 CSV 数据显示为数组或其他内容作为输出

我已经创建了“hello world”模块并且控制器调用工作正常。

CSV File location is data/csv/Foo.csv

下面是我的控制器:

public function indexAction()
{
  $filename = 'data/csv/Foo.csv';
  $useFirstRecordAsHeader = true;
  $delimiter = ',';
  $enclosure = '"';
  $escape = '\';
  $this->file = new SplFileObject($filename);
  $this->file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);

  $this->file->setCsvControl($delimiter, $enclosure, $escape);

  $this->useFirstRecordAsHeader = $useFirstRecordAsHeader;

   return $this;
    
}

但现在我收到错误消息:

SplFileObject::__construct(csv/Foo.csv): failed to open stream: No such file or directory

我的 CSV 文件在同一文件夹中 controller/csv/Foo.csv

如何读取CSV文件内容并显示为输出数组或任何其他格式?我只想使用 Zend Framework 2 来完成它。

您不应该将 csv 目录放在 Controller 目录中,因为它不是控制器。它违反了 MVC 架构。好的做法是将数据放在根目录下的 data 目录中,与 module 目录处于同一级别。

所以假设你把它放在这个 data 目录中,你可以简单地写:

$this->file = new SplFileObject('data/csv/Foo.csv');

或更好(为了便携性):

$filename = 'data'. DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv' ;
$this->file = new SplFileObject($filename );

您正在尝试打开 $this->file = new SplFileObject('csv/Foo.csv');,因为您使用的是相对路径,执行时不会解析为您的控制器所在的文件夹(它可能会解析为 [yourprojectroot]/csv/Foo.csv) .

如果您真的想要将此 csv 存储在 controller/csv 中,您应该使用类似的东西:

 $this->file = new SplFileObject(dirname(__FILE__) . '/csv/Foo.csv');

但是,出于多种原因,将 csv 保存在那里是错误的。首先,您需要向您的网络服务器授予写权限才能在该目录中写入,并且您会从根本上搞乱您的 data/code 结构(数据和代码不应该放在一起,但很容易分离筒仓)。

更好的是,在您的项目目录中创建一个文件夹 "data" 和另一个文件夹 "csv",授予您的网络服务器在其中写入的权限 (chmod || chown, other methods),然后执行以下操作:

 $file = 'data'. DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv' ;
 $this->file = new SplFileObject($file );

除此之外,我不确定您返回的内容是否真的有意义。尝试类似的东西:

public function indexAction()
{
    $filename = 'data' . DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv';;
    $this->file = new SplFileObject($filename);
    $this->file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);

    $this->file->setCsvControl(',', '""', '\');
    $this->useFirstRecordAsHeader = true;

    $response = $this->getResponse();
    $headers  = $response->getHeaders();
    $headers->addHeaderLine('Content-Type', 'text/csv');

    $contents = $this->file->fread($this->file->getSize());

    $response->setContent($contents);
    return $response;
}