Home  >  Q&A  >  body text

Compare CSV rows in php

I have the following code that allows me to generate a csv file from a database.

<?php
require_once 'dbconfig.php';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);

    $sql = 'SELECT o.id_order ,c.id_customer, c.firstname, c.lastname, a.address1, a.address2, a.postcode, a.city,a.phone,c.email,a.phone_mobile, od.product_id, od.product_name,od.product_quantity, od.product_price,o.total_paid_tax_incl, c.id_customer, op.date_add, op.amount, op.payment_method 
    FROM mod582_orders o 
    INNER JOIN mod582_customer c ON o.id_customer = c.id_customer 
    INNER JOIN mod582_address a ON o.id_address_delivery = a.id_address 
    INNER JOIN mod582_order_detail od ON o.id_order = od.id_order 
    INNER JOIN mod582_order_payment op ON o.reference = op.order_reference 
    WHERE CAST(o.date_add AS DATE) LIKE "2023-01%" /*CAST( curdate() AS DATE)*/; 
    ';
    
    $r = $pdo->query($sql);

$tab = \[\];
$tab\[\] = \['ORDNOORDER', 'ORDREFCUSORDER', 'ORDNOCOSTNUMBER','ORDNOCUSTOMER','ORDCUSTOMERCODE','ORDCUSCAT','ORDTYPE','ORDCURRENCY','ORDCURRENCYRATE','ORDDESIGNATION','ORDREPCODE','ORDPORT','ORDPORTTYPE','ORDPORTRATE','DEONOORDER','DEOCOMMENT','DEOCOUNTRY','DEONAME','DEOFIRSTNAME','DEOADDRESS1','DEOADDRESS2','DEOZIPCODE','DEOCITY','DEOPHONE','DEOMAIL','DEOPHONEPORTABLE','ODLNOORDER','ODLNOORDERLINE','ODLNOARTICLE','ODLARTDESIGN','ODLQUANTITYORDER','ODLTTCCURUPRICE','ODLCODEPARCELLEFLEU','PAYNUMPAYMENT','PAYNOCUSTOMER','PAYNOORDER','PAYNOCURRENCY','PAYDATEPAYMENT','PAYPAYMENTTTCCUR','PAYCURRENCYRATE','PAYCONTREPARTIE'\];
$odrline = 1;
while($rs = $r-\>fetch(PDO::FETCH_ASSOC)){
$tab\[\] = \[$rs\['id_order'\], $rs\['id_order'\], '17', '', 'AAA'.$rs\['id_customer'\],'DET','O','EUR','1','','115','D','P','17', $rs\['id_order'\],'','FRA', $rs\['firstname'\], $rs\['lastname'\], $rs\['adress1'\], $rs\['adress2'\], $rs\['postcode'\], $rs\['city'\], $rs\['phone'\], $rs\['email'\], $rs\['phone_modile'\], $rs\['id_order'\],$odrline, $rs\['product_id'\], $rs\['product_name'\], $rs\['product_quantity'\], $rs\['product_price'\],'','','', $rs\['id_order'\],'EUR', $rs\['date_add'\], $rs\['amount'\],'1','VIR'\];
}

$fichier_csv = new SplFileObject('vinistoria/commandes.csv', 'w');
foreach($tab as $ligne){
$fichier_csv-\>fputcsv($ligne, ';');
}
$date = date('d-m-y h:i:s');
echo "nouveau fichier commandes.csv créé à ". $date;
} catch (PDOException $e) {
die("Could not connect to the database $dbname :" . $e-\>getMessage());
}

?\>

However, I have some fields that need to be changed based on the field values ​​in the previous row of the csv. For example : For all rows where $rs['id_order'] has value 486, my odrline value is 1, but if in next row $rs['id_order'] is 487 odrline should be 2 etc..

How can I browse my file and change the value based on the field in the previous row?

How can I browse my file and change the value based on the field in the previous row?

P粉649990273P粉649990273171 days ago342

reply all(1)I'll reply

  • P粉207969787

    P粉2079697872024-04-05 12:15:03

    Don't change data through a file after it is created, instead process the data before creating the file.

    Store id_order in a variable and compare at the beginning of each loop iteration.

    Similar to:

    $odrline = 0;   // start with zero, as incremented before first written out
    $prevordernumber = 0;   // pick a number that is not a valid order number
                            // or empty string if not numeric
    while($rs = $r->fetch(PDO::FETCH_ASSOC)){
      // if order number has changed then increment order line
      if($prevordernumber != $rs['id_order']) $odrline++;
      $tab [] = ........
    
      // update stored previous order number
      $prevordernumber = $rs['id_order'];  
    }
    // write $tab to file
    $fichier_csv = new SplFileObject('vinistoria/commandes.csv', 'w');
    foreach($tab as $ligne){
    $fichier_csv-\>fputcsv($ligne, ';');

    reply
    0
  • Cancelreply