Zeile in CSV Datei ändern/löschen

GottiRhg

Mitglied
Hallo zusammen,
ich habe ein kleines Problem bei einer PHP Seite innerhalb der Verarbeitung von CSV-Daten.

Problemstellung:
Ich möchte mittels einer ID eine Zeile aus einer CSV Datei lesen und den Inhalt anpassen.

Aufbau CSV:
ID|Wert1|Wert2|Wert3

Hier mein Code:
Code:
	$file = fopen ("events.csv","r+");
	while($data = fgetcsv($file, 5000, ";")){
		if($data[0] == $newId){
			$newData = array($newId, $newLocation, $newStart, $newEnd);
			$line = implode(';', $newData);
			
			fputs($file, $line);
                        fclose($file); 
			break;
		}
	}

Komischerweise hängt er am Ende der CSV eine Datei an, anstatt die Zeile, auf welcher der Zeiger ist zu überschreiben.
Kann mir jemand helfen?
 
fputs hängt hinten an der Datei an. Ich würde das so lösen
PHP:
//Datei Einlesen - jede Zeile ein Eintrag im Array
$filePath = 'events.csv';
$lines = file($filePath);

//Die Zeilen durchgehen. $line ist dabei eine Refernez auf den Eintrag im Array
foreach($lines as &$line){
	$fields = str_getcsv($line, ';');
	if($fields[0] == $newId){
		$line = implode(';', array($newId, $newLocation, $newStart, $newEnd));
		break;
	}
}
//Datei überschreiben
file_put_contents($filePath, $lines);
 
Soweit so gut.
Allerdings bearbeitet er dann die 1. Zeile und knallt die 2. Zeile direkt an die 1. Zeile.
Sprich:
Die nachfolgende Zeile ist dadurch kaputt.
 
Dann vergessen wir das mit der Referenz mal und versuchen das folgende
PHP:
...
foreach($lines as $index => $line){
	$fields = str_getcsv($line, ';');
	if($fields[0] == $newId){
		$lines[$index] = implode(';', array($newId, $newLocation, $newStart, $newEnd));
		break;
	}
}
..
 
Okay. Ausgabe:
Code:
array(4) { [0]=> string(39) "1;asd;17.09.2012 22:55;17.09.2012 22:55" [1]=> string(47) "2;Test2;"17.09.2012 22:55";"17.09.2012 22:55" " [2]=> string(47) "3;Test3;"17.09.2012 22:55";"17.09.2012 22:55" " [3]=> string(45) "4;Test4;"17.09.2012 22:55";"17.09.2012 22:55"" }

Hilft dir das weiter, Yaslaw?
Für mich sieht das String-Array gut aus. Wieso macht er nach der bearbeiteten Zeile keinen Umbruch?
Fehlt hier ggf. irgendwo ein \n?
 
Das Ganze musst du wie folgt machen:

1.)CSV datei über zB die Funktion ausm manual in ein zweidimensionales Array kopieren lassen
2.)Dieses Array bearbeiten (zB eine entsprechende zeile bearbeiten
3.) Mit fputcsv() in gleichnamige datei schreiben (dabei wird die alte überschreiben)
 
Okay.
Prinzip verstanden.

Kannst du mir beim Coding etwas auf die Sprünge helfen?
Das auslesen und manipulieren sollte wie folgt funktionieren, oder?

Nur das wegschreiben klappt nicht.

Code:
	$filePath = 'events.csv';
	$lines = file($filePath);
	foreach($lines as $index => $line){
		$fields = str_getcsv($line, ';');

		if($fields[0] == $newId){
			$fields[1] = $newLocation;
			$fields[2] = $newStart;
			$fields[3] = $newEnd;
		}
	}
 
PHP:
<?php

$csv_file = 'events.csv';

// In array einlesen
if (($handle = fopen($csv_file, "r")) !== FALSE) {
	
		$csv_array = array();
	
		while (($data = fgetcsv($handle, 10000, ";")) !== FALSE) {
			
			$csv_array[] = $data;
			
		}
		
		fclose($handle);
		
	}

// Hier dann das CSV-Array durchsuchen und manipulieren -- evt anpassen
foreach ($csv_array as &$line) {

	if($line[0] == $newId){
        $line = array($newId, $newLocation, $newStart, $newEnd);
    }
	
}

// wieder zurückschreiben
$fp = fopen($csv_file, 'w');


foreach ( $csv_array as $fields ) {

	fputcsv( $fp, $fields, ";" );
		
}

fclose($fp);

ungetestet
 

Neue Beiträge

Zurück