【问题标题】:Export data into CSV file in Symfony在 Symfony 中将数据导出为 CSV 文件
【发布时间】:2019-01-18 19:08:58
【问题描述】:

我在 Symfony3 中制作了控制台应用程序,用户可以在其中将 CSV 文件(验证)导入数据库。我需要将未通过验证的记录放入单独的文件中。

我使用 LeagueCSV 读取 CSV 文件,并尝试使用它来写入未经验证的记录,但它不起作用。

这是我的代码:

$reader = Reader::createFromPath($input->getArgument('lokalizacja'));
$reader->setDelimiter(';');
$reader->setHeaderOffset(0);

$results = $reader->getRecords();

foreach ($results as $row) {

  $year = $row['description'];

  $isValid = false;

  if ($row['qty'] > 0 && $row['price'] > 0 && !empty($row['mpn'])) {

      $isValid = true;

      $rok = filter_var($row['description'], FILTER_SANITIZE_NUMBER_INT);

            $product = (new Produkt())
                    ->setMpn($row['mpn'])
                    ->setQty($row['qty'])
                    ->setYear($year)
                    ->setPrice($row['price']);

            $this->em->persist($product); }

  if ($row['qty'] == 0 || $row['price'] == 0 || empty($row['mpn'])) {

       $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+');              
       $writer->insertOne([$row['mpn'], $row['qty'], $row['price'], 
                      $row['description']]);

        continue;
  }                
}

    $this->em->flush();

所有通过验证的记录都成功保存在数据库中,但我对其他记录有问题。在新的 CSV 文件中,我只有第一个,一条未通过验证的记录,仅此而已。我究竟做错了什么?我试过了

$writer->insertAll($results); //using an array

或者使用 if...else 语句,但这没什么。

我还做了 ...else 语句,其中未经验证的记录保存在数据库的其他表中,但我不知道如何立即将它们转换为 CSV 文件。

【问题讨论】:

  • 尝试在foreach循环之前移动$writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+');
  • 天哪 ;D 终于成功了!非常感谢!
  • 太棒了!我添加了一个答案

标签: php symfony csv export-to-csv


【解决方案1】:

不知道 symfony,但 CSV 输出非常简单。 FWIW...

传递一个数组,就像一个 fetchall 结果集。

<?php
public function outputCSV($data, $useKeysForHeaderRow = true) {
    if ($useKeysForHeaderRow) {
        array_unshift($data, array_keys(reset($data)));
    }

    $outputBuffer = fopen("php://output", 'w');
    foreach($data as $v) {
        fputcsv($outputBuffer, $v);
    }
    fclose($outputBuffer);
}

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="FooBarFileName_' . date('Ymd') . '.csv"');
header("Pragma: no-cache");
header("Expires: 0");
$this->outputCSV($results);

【讨论】:

    【解决方案2】:

    如果您查看the doc page for the writer,您会在顶部看到一条警告

    使用 League\Csv\Writer 将记录插入 CSV 文档时,首先插入所有需要插入的数据,然后再开始操作 CSV。如果您在插入之前操作 CSV 文档,您可能会更改文件光标位置并删除您的数据。

    你的代码调用

    $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+');              
    $writer->insertOne([$row['mpn'], $row['qty'], $row['price'], $row['description']]);
    

    在每次迭代中都满足条件,这似乎每次都会覆盖或删除您之前的插入。您应该在循环开始之前声明一次$writer,以保留每个插入。

    $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+');
    foreach ($results as $row) { 
      // do stuff with $writer
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 2016-08-03
      • 1970-01-01
      相关资源
      最近更新 更多