Jump to content

CSV Class? Need help updating a csv file.


ballhogjoni
Go to solution Solved by mac_gyver,

Recommended Posts

Is there a php class to update a csv file? I'm not very well versed with fputcsv, but looking at the documentation it doesn't seem to give me what I want. I see that I pass it the file handler and an array of data to write to the csv. I want to update one column of data at a time not an entire row. I'm stuck on where to go from here. In one csv I have a product sku that is located in column 9 and the other csv column 13. These columns are the identifying info I need to know I am looking at the same product on both csv's.

 

The "In" csv is the origin which contains the inventory quantity. I need to transfer that quantity to the "out" csv. I figure the way to do this is by reading the origin line by line and placing the sku and the inventory in an array. I then loop through that array and read the "out" csv and search for a match. Once I find a match I need to update that products' inventory column from the origin csv.

 

Makes sense? Any help would be helpful. This is the code I have so far, probably far off from what I need.

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('auto_detect_line_endings', true);

if (empty($_GET['in']))
  die("Please pass file name to check inventory.");

if (empty($_GET['out']))
  die("Please pass file name to update inventory.");

$in = $_GET['in'] . ".csv";
$out = $_GET['out'] . ".csv";

$h_in = fopen($in, "r");
if (!$h_in)
  die("$in can't be read.");

$h_out = fopen($out, "r+");
if (!$h_out)
  die("$out can't be opened to read and write");

$rsr_inv = array();
$productskus = array();
$products = array();

$flag = true;
while (false !== ($row = fgetcsv($h_out))) {
  if($flag) { $flag = false; continue; }
  $productskus[] = $row[13];
  $products[] = $row;
}

while (false !== ($row = fgetcsv($h_in))) {
  $key = array_search($row[0], $productskus);
  if ($key) {
    $rsr_inv[] = array($productskus[$key], $row[8]);
  }
}
fclose($h_in);

foreach($products as $key => $prod){
  echo $inv[0] . ":" . $products[$key][13] . "<br>";
  //if($inv[0] == $products[$key][13]){}

}

fclose($h_out);
Link to comment
Share on other sites

here is how i would do this -

 

1) open and read all the "in" data into an array with sky as the index/key and the quantity is the array value. close the file as you no longer need the file handle.

 

2) open the existing "out" file for reading and open a temporary file for writing.

 

3) in a loop, use fgetcsv to read each line from the existing "out" file into an array, one line at a time. using the sku element of this array, get the quantity from the array made in step #1 and store it to the correct quantity element of the current line's array. write the array to the temporary output file made in step #2.

 

4) when done looping through all the lines in the existing "out" file, close all open files and if there have been no errors, delete the original "out" file and rename the temporary file to the original "out" file name.

Link to comment
Share on other sites

  • Solution

the basic logic would be -

<?php

$infile = 'in.csv'; // a file for testing only
$csvfile = 'out.csv'; // another file for testing only

$tempfile = tempnam(".", "tmp"); // produce a temporary file name, in the current directory

// modify the values to match your data structure
define('IN_SKU',1); // define the offset of the incoming sku column
define('IN_QTY',2); // define the offset of the incoming quantity column
define('OUT_SKU',1); // define the offset of the outgoing sku column
define('OUT_QTY',2); // define the offset of the outgoing quantity column

// read incoming sku/qty
if(!$handle = fopen($infile, "r")){
	die('could not open incoming file');
}
$in_data = array();
$header = true;
while(($data = fgetcsv($handle)) !== FALSE){
	if($header){
		$header = false;
		continue;
	}
	$in_data[$data[IN_SKU]] = $data[IN_QTY];
}
fclose($handle);

// process data, updating the quantity with any incoming quantity
if(!$input = fopen($csvfile,'r')){
	die('could not open existing csv file');
}
if(!$output = fopen($tempfile,'w')){
	die('could not open temporary output file');
}
$header = true;
while(($data = fgetcsv($input)) !== FALSE){
	if(!$header && isset($in_data[$data[OUT_SKU]])){
		$data[OUT_QTY] = $in_data[$data[OUT_SKU]]; // modify qty if exists in the in_data
	}
	fputcsv($output,$data); // write the line to the output
	$header = false;
}
fclose($input);
fclose($output);

unlink($csvfile);
rename($tempfile,$csvfile);

echo 'done';
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.