Export data into CSV file in Symfony












0















I have console app made in Symfony3, where user can import CSV file (which is validate) into database. I need to put records which haven't passed validation into separate file.



I use LeagueCSV to read CSV file and I try to use it to write unvalidated records but it doesn't work.



This is my code:



$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();


All records which passed validation are successfully saved in the database but I have problem with others records. In new CSV file I have only first, one record which haven't passed validation and nothing more. What am I doing wrong? I tried with



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


Or with if...else statment but that's nothing.



Also I made ...else statement where unvalidated records are saved in other table in database and its works but I don't know how to immediately convert them into CSV file.










share|improve this question

























  • Try moving $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); before the foreach loop

    – Arleigh Hix
    Jan 18 at 22:11











  • Oh god ;D It's finally works! Thank you so much!

    – miguelsantos69
    Jan 18 at 23:48











  • Great! I added an answer

    – Arleigh Hix
    Jan 19 at 1:29
















0















I have console app made in Symfony3, where user can import CSV file (which is validate) into database. I need to put records which haven't passed validation into separate file.



I use LeagueCSV to read CSV file and I try to use it to write unvalidated records but it doesn't work.



This is my code:



$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();


All records which passed validation are successfully saved in the database but I have problem with others records. In new CSV file I have only first, one record which haven't passed validation and nothing more. What am I doing wrong? I tried with



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


Or with if...else statment but that's nothing.



Also I made ...else statement where unvalidated records are saved in other table in database and its works but I don't know how to immediately convert them into CSV file.










share|improve this question

























  • Try moving $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); before the foreach loop

    – Arleigh Hix
    Jan 18 at 22:11











  • Oh god ;D It's finally works! Thank you so much!

    – miguelsantos69
    Jan 18 at 23:48











  • Great! I added an answer

    – Arleigh Hix
    Jan 19 at 1:29














0












0








0








I have console app made in Symfony3, where user can import CSV file (which is validate) into database. I need to put records which haven't passed validation into separate file.



I use LeagueCSV to read CSV file and I try to use it to write unvalidated records but it doesn't work.



This is my code:



$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();


All records which passed validation are successfully saved in the database but I have problem with others records. In new CSV file I have only first, one record which haven't passed validation and nothing more. What am I doing wrong? I tried with



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


Or with if...else statment but that's nothing.



Also I made ...else statement where unvalidated records are saved in other table in database and its works but I don't know how to immediately convert them into CSV file.










share|improve this question
















I have console app made in Symfony3, where user can import CSV file (which is validate) into database. I need to put records which haven't passed validation into separate file.



I use LeagueCSV to read CSV file and I try to use it to write unvalidated records but it doesn't work.



This is my code:



$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();


All records which passed validation are successfully saved in the database but I have problem with others records. In new CSV file I have only first, one record which haven't passed validation and nothing more. What am I doing wrong? I tried with



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


Or with if...else statment but that's nothing.



Also I made ...else statement where unvalidated records are saved in other table in database and its works but I don't know how to immediately convert them into CSV file.







php symfony csv export-to-csv






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 18 at 19:14









Mohammadreza Farahani

2,01031224




2,01031224










asked Jan 18 at 19:08









miguelsantos69miguelsantos69

12




12













  • Try moving $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); before the foreach loop

    – Arleigh Hix
    Jan 18 at 22:11











  • Oh god ;D It's finally works! Thank you so much!

    – miguelsantos69
    Jan 18 at 23:48











  • Great! I added an answer

    – Arleigh Hix
    Jan 19 at 1:29



















  • Try moving $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); before the foreach loop

    – Arleigh Hix
    Jan 18 at 22:11











  • Oh god ;D It's finally works! Thank you so much!

    – miguelsantos69
    Jan 18 at 23:48











  • Great! I added an answer

    – Arleigh Hix
    Jan 19 at 1:29

















Try moving $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); before the foreach loop

– Arleigh Hix
Jan 18 at 22:11





Try moving $writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); before the foreach loop

– Arleigh Hix
Jan 18 at 22:11













Oh god ;D It's finally works! Thank you so much!

– miguelsantos69
Jan 18 at 23:48





Oh god ;D It's finally works! Thank you so much!

– miguelsantos69
Jan 18 at 23:48













Great! I added an answer

– Arleigh Hix
Jan 19 at 1:29





Great! I added an answer

– Arleigh Hix
Jan 19 at 1:29












2 Answers
2






active

oldest

votes


















0














Don't know symfony but CSV output is pretty simple. FWIW...



Pass this an array, like a fetchall resultset.



<?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);





share|improve this answer

































    0














    If you look at the doc page for the writer you will see a warning at the top which states




    When inserting records into a CSV document using LeagueCsvWriter, first insert all the data that need to be inserted before starting manipulating the CSV. If you manipulate your CSV document before insertion, you may change the file cursor position and erase your data.




    Your code calls



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


    In every iteration the condition is met, this appears to be overwriting or dropping your previous insert every time. You should declare the $writer once before the loop starts in order to preserve each insert.



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





    share|improve this answer























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54260094%2fexport-data-into-csv-file-in-symfony%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      0














      Don't know symfony but CSV output is pretty simple. FWIW...



      Pass this an array, like a fetchall resultset.



      <?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);





      share|improve this answer






























        0














        Don't know symfony but CSV output is pretty simple. FWIW...



        Pass this an array, like a fetchall resultset.



        <?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);





        share|improve this answer




























          0












          0








          0







          Don't know symfony but CSV output is pretty simple. FWIW...



          Pass this an array, like a fetchall resultset.



          <?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);





          share|improve this answer















          Don't know symfony but CSV output is pretty simple. FWIW...



          Pass this an array, like a fetchall resultset.



          <?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);






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Jan 18 at 19:26

























          answered Jan 18 at 19:20









          ficuscrficuscr

          5,71321945




          5,71321945

























              0














              If you look at the doc page for the writer you will see a warning at the top which states




              When inserting records into a CSV document using LeagueCsvWriter, first insert all the data that need to be inserted before starting manipulating the CSV. If you manipulate your CSV document before insertion, you may change the file cursor position and erase your data.




              Your code calls



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


              In every iteration the condition is met, this appears to be overwriting or dropping your previous insert every time. You should declare the $writer once before the loop starts in order to preserve each insert.



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





              share|improve this answer




























                0














                If you look at the doc page for the writer you will see a warning at the top which states




                When inserting records into a CSV document using LeagueCsvWriter, first insert all the data that need to be inserted before starting manipulating the CSV. If you manipulate your CSV document before insertion, you may change the file cursor position and erase your data.




                Your code calls



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


                In every iteration the condition is met, this appears to be overwriting or dropping your previous insert every time. You should declare the $writer once before the loop starts in order to preserve each insert.



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





                share|improve this answer


























                  0












                  0








                  0







                  If you look at the doc page for the writer you will see a warning at the top which states




                  When inserting records into a CSV document using LeagueCsvWriter, first insert all the data that need to be inserted before starting manipulating the CSV. If you manipulate your CSV document before insertion, you may change the file cursor position and erase your data.




                  Your code calls



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


                  In every iteration the condition is met, this appears to be overwriting or dropping your previous insert every time. You should declare the $writer once before the loop starts in order to preserve each insert.



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





                  share|improve this answer













                  If you look at the doc page for the writer you will see a warning at the top which states




                  When inserting records into a CSV document using LeagueCsvWriter, first insert all the data that need to be inserted before starting manipulating the CSV. If you manipulate your CSV document before insertion, you may change the file cursor position and erase your data.




                  Your code calls



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


                  In every iteration the condition is met, this appears to be overwriting or dropping your previous insert every time. You should declare the $writer once before the loop starts in order to preserve each insert.



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






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Jan 19 at 1:27









                  Arleigh HixArleigh Hix

                  924412




                  924412






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54260094%2fexport-data-into-csv-file-in-symfony%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Liquibase includeAll doesn't find base path

                      How to use setInterval in EJS file?

                      Petrus Granier-Deferre