Jump to content

tell csv import script to ignore blank rows?


marksie1988

Recommended Posts

Hi i have the below script but i get an error if a row is blank ie a return in the csv file at the end i need to somehow tell it to skip the rows that have nothing on them:

 

<?php
// define table name and csv file location and name

$supp_id = "15";
$pricecode = "6";
$csvupload = "../ccd/Catalogue_ZZMILGAT.csv";

// create DB connection
$host = "localhost";
$user = "user";
$pass = "pass";
$mydb = "db";
$table = "table";

	$db = mssql_connect($host,$user,$pass);
	mssql_select_db($mydb);

// delete all old data
	$sql2 = "DELETE FROM ".$table." WHERE supp_id = ".$supp_id."";

mssql_query($sql2) or die("Failed to insert to db ");

// Define DB mapping (Fill in rest of the mapping in order of appearance in CSV)
$fields = array(
"manufacturer",
"ignore",
"manf_part_no",
"supp_part_no",
"description",
"rrp",
"cost_price",
"avail_qty");


// Open the CSV file
$handle = fopen($csvupload, "r") or die("Unable to open $csvupload for reading");

// Get each row's values to an array 
$i = 1;
// define tab delimited or comma
while (($data = fgetcsv($handle, 512, ",")) !== FALSE) {
	// First row's headers and not included, otherwise row field count must match wanted field count
	if(count($data)==count($fields) && $i!=1){
		$rows[] = $data;
	}
	elseif(count($data)!=count($fields)) {			
		die("Erroneus CSV file: incorrect field count on row $i");
	}
	$i++;
}

// Close file handle
fclose($handle);

// Create SQL
if(count($rows)==0) die("No rows found in user file");


 // Remove last comma
foreach($rows as $i => $row){
	$sql = "INSERT INTO ".$table." (";
foreach($fields as $field)
	if($field!="ignore")
		$sql .= "$field,";
$sql = substr($sql,0,-1).",supp_id, date_added, PriceCode) VALUES ";
	$sql .= "(";
	foreach($row as $j => $value){
		if($fields[$j]!="ignore"){
			if(empty($value))
				$value = "0";
			// Quote strings, try to remove existing quotes
			elseif(!is_numeric($value))
				$value = str_replace("'","",$value);
				$value = str_replace("\"","",$value);
			$sql .= "'$value',";
		}
	}

	$sql = substr($sql,0,-1).",'".$supp_id."', getdate(),'".$pricecode."')"; // Remove last comma
	//echo "SQL became: $sql";

	mssql_query($sql) or die("Failed to insert to db ");

}

?>

Link to comment
Share on other sites

Hi Thanks,

 

unfortunately i get this error:

 

Warning: preg_match() expects parameter 2 to be string, array given in E:\CSV\CSV_GALTEC\ImportScripts\ccd.php on line 43

 

line 43 is:

 

if(count($data)==count($fields) && $i!=1 && preg_match('~[\S]~', $data)){

Link to comment
Share on other sites

Okay, change

 

      if(count($data)==count($fields) && $i!=1){
   $j = 0;
   foeach($fields as $v)
      {
      if(!preg_match("~\S~", $v)
         {
         $j = 1;
         }
      }

   if($j == 1)
      {
      continue;
      }

         $rows[] = $data;
      }

 

To

 

   $j = 0;
   foeach($fields as $v)
      {
      if(!preg_match("~\S~", $v)
         {
         $j = 1;
         }
      }

   if($j == 1)
      {
      continue;
      }

      if(count($data)==count($fields) && $i!=1){


         $rows[] = $data;
      }

Link to comment
Share on other sites

Try this

 

<?php
// define table name and csv file location and name

$supp_id = "15";
$pricecode = "6";
$csvupload = "../ccd/Catalogue_ZZMILGAT.csv";

// create DB connection
$host = "localhost";
$user = "user";
$pass = "pass";
$mydb = "db";
$table = "table";

      $db = mssql_connect($host,$user,$pass);
      mssql_select_db($mydb);

// delete all old data
    $sql2 = "DELETE FROM ".$table." WHERE supp_id = ".$supp_id."";

   mssql_query($sql2) or die("Failed to insert to db ");
   
// Define DB mapping (Fill in rest of the mapping in order of appearance in CSV)
$fields = array(
   "manufacturer",
   "ignore",
   "manf_part_no",
   "supp_part_no",
   "description",
   "rrp",
   "cost_price",
   "avail_qty");


   // Open the CSV file
   $handle = fopen($csvupload, "r") or die("Unable to open $csvupload for reading");

   // Get each row's values to an array 
   $i = 1;
   // define tab delimited or comma
   while (($data = fgetcsv($handle, 512, ",")) !== FALSE) {
      // First row's headers and not included, otherwise row field count must match wanted field count
      if(count($data)==count($fields) && $i!=1){
         $rows[] = $data;
      }
      elseif(count($data)!=count($fields) && count($data) > 1) {         
         die("Erroneus CSV file: incorrect field count on row $i");
      }
      $i++;
   }

   // Close file handle
   fclose($handle);
   
   // Create SQL
   if(count($rows)==0) die("No rows found in user file");

   
    // Remove last comma
   foreach($rows as $i => $row){
      $sql = "INSERT INTO ".$table." (";
   foreach($fields as $field)
      if($field!="ignore")
         $sql .= "$field,";
   $sql = substr($sql,0,-1).",supp_id, date_added, PriceCode) VALUES ";
      $sql .= "(";
      foreach($row as $j => $value){
         if($fields[$j]!="ignore"){
            if(empty($value))
               $value = "0";
            // Quote strings, try to remove existing quotes
            elseif(!is_numeric($value))
               $value = str_replace("'","",$value);
               $value = str_replace("\"","",$value);
            $sql .= "'$value',";
         }
      }
      
      $sql = substr($sql,0,-1).",'".$supp_id."', getdate(),'".$pricecode."')"; // Remove last comma
      //echo "SQL became: $sql";

      mssql_query($sql) or die("Failed to insert to db ");
      
   }

?>

Link to comment
Share on other sites

ok i now have an issue with the fixed script that if the csv file has a column with e.g.

 

Dell Computer Memory\

 

it will think that the \ is signifying a new column so it says there the field count is incorrect on the row with the \ is there i way i can str_replace this from the csv file?

 

when i add it to the script where the current str_replace is it doesnt work.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.