thephpleague/csv

How do you edit data in a row?

jason-engage opened this issue · 5 comments

I'm not seeing anything in the documentation about editing/updating row data? Do I have to create a new csv and copy over all the data that I don't want to edit and then insert a new row that contains the edited data?

@jason-engage thanks for using the library. Indeed your are correct since the package is based on stream you can only read from or write to a stream. Updating/Editing is not an option.

Depending on what you want to do with the updated data. Generally speaking, that operation is performant and fast.

@jason-engage thanks for using the library. Indeed your are correct since the package is based on stream you can only read from or write to a stream. Updating/Editing is not an option.

Depending on what you want to do with the updated data. Generally speaking, that operation is performant and fast.

You should consider adding an ::Updater to your package, and use a non-stream solution for it. It's a critical feature and feels incomplete without it. Anyways I did end up using it and found a workaround for my case. Cheers

@jason-engage I am always open to PR including that feature to the package 😉

hxdev commented

@jason-engage thanks for using the library. Indeed your are correct since the package is based on stream you can only read from or write to a stream. Updating/Editing is not an option.
Depending on what you want to do with the updated data. Generally speaking, that operation is performant and fast.

You should consider adding an ::Updater to your package, and use a non-stream solution for it. It's a critical feature and feels incomplete without it. Anyways I did end up using it and found a workaround for my case. Cheers

@jason-engage Hi, could you please share your workaround?

@hxdev

@jason-engage Hi, could you please share your workaround?

Sure, basically, just add the data to the end, and then de-dupe the csv. The CSV unique is custom to my csv type. 2 columns, with column 1 being a unique ID. You'll have to modify to fit your data structure, based on the unique column.

//REMOVE DUPLICATES
      $old = csvParse($csv_path);
      $unique = csvUnique($old);
      csvUpdate($unique, $csv_path);
  

// Read data from csv and return data
function csvParse(string $csv = null): array {
	$data = [];
	$data = array_map('str_getcsv', file($csv));

	return $data;
}

// Remove duplicate values from data
function csvUnique(array $data = []): array {
	$result = [];

	foreach ($data as $key => $val) {
        if ( !empty($val[0]) && !empty($val[1]) ) {
           $result[$val[0]] = $val[1];
       }
    }

    $data = [];

    foreach ($result as $key => $val) {
	    $data[] = [$key,$val];
	}

    return $data;
}

// Update csv with unique data
function csvUpdate(array $unique = [], string $csv = null): void {
	$fp = fopen($csv, 'w');

	foreach($unique as $fields) {
		fputcsv($fp, $fields);
	}

	fclose($fp);
	echo "Done!".PHP_EOL;
}