Konvertierung von Cols to line

Dolphon

Erfahrenes Mitglied
Moin,

ich bräuchte einmal Hilfe von euch.

Folgende Datei wird eingelesen :

Code:
"Feld1","Feld2","Feld3"
"Data1","Data2: String="xyz" fertig","Data3"
......

daraus soll das Skript folgendes machen:

Code:
Feld1;Data1;.....
Feld2;Data2: String="xyz" fertig;.....
Feld3;Data3;......

Ich habe damit einmal angefangen.

1. Problem:

Mit trim bekomme ich die Anführungszeichen am Anfang und ende nicht weg.

2. Problem.
Wie kann ich den weiteren Inhalt in die bereits bestehen Zeilen anfügen.
Z.Z schreibt er den Inhalt immer nur in eine neue Zeile.

Code:
"Feld1";
"Feld2";
"Feld3"
;
"Data1";"Data2: String="xyz" fertig";"Data3"
;

Hier der Code:

PHP:
	$fh = file($argv[1])  or die ("cannot open file ".$argv[1]."\n"); #File in ein Array einlesen
	$resultfile=fopen("konvertiert_zu_line.txt","w");
		$i=1;
		foreach ($fh as $element) 
		{
			list($field1, $field2, $field3) = explode(",", $element);
			if ($i==1)
			{
				trim($field1,"char(34)");
				trim($field2,"\"");
				trim($field3,"\"");
				fputs($resultfile,$field1.";\r\n".$field2.";\r\n".$field3.";\r\n");
			}
			if ($i>1)
			{
			fputs($resultfile,$field1.";".$field2.";".$field3.";");
			
			}
			
			
			
			$i++;
		}

		echo "Konvertierung erfolgreich";
		fclose($resultfile);
		unset($fh); # Delete Array
 
Problem 1 war mein Fehler. Weiß garnicht was ich mir da gedacht hatte.

Wenn ich bei Problem 2 die Zeilenumbrüche weglasse, dann packt er mir die Feldnamen alle in eine Zeile. Das darf ja nicht sein.
Jeder Feldname muss in einer Zeiel stehen. Und dahinter soll dann jeweils die Daten kommen, durch ; getrennt.
Genau das bekomme ich nicht, weil ich nicht weiß, wie er die Daten an einer Zeile anfügt.
 
Hi,

Wenn ich bei Problem 2 die Zeilenumbrüche weglasse, dann packt er mir die Feldnamen alle in eine Zeile. Das darf ja nicht sein.
Jeder Feldname muss in einer Zeiel stehen. Und dahinter soll dann jeweils die Daten kommen, durch ; getrennt.

oh, ich hatte das Beispiel nicht genau genug angeschaut. Ich hatte gedacht, Du wolltest eine Standard CSV-Datei daraus machen.

Kannst Du mal ein längeres Beispiel angeben (was folgt nach der 2. Zeile mit den Daten und was soll daraus werden)?

LG
 
Sorry für die späte Antwort.

Folgende Datei wird von dem Skript eingelesen:

Code:
"Feld1","Feld2","Feld3","Feld4",............
"Data1","Data2: String="xyz" fertig","Data3","Data4",............


Daraus soll das Skript folgende Datei erstellen:

Code:
Feld1;Data1
Feld2;Data2: String="xyz" fertig
Feld3;Data3
Feld4;Data4
................


Mein Codeanfang erstellt leider z.Z nur folgendes
Desweitern auch nur Fest auf 3 Spalten gestellt.:

Code:
Feld1;
Feld2;
Feld3;
Data1;Data2: String="xyz" fertig;Data3

Hier einmal mein Code:

PHP:
	$fh = file($argv[1])  or die ("cannot open file ".$argv[1]."\n"); #File in ein Array einlesen
	$resultfile=fopen("konvertiert_zu_line.txt","w");
		$i=1;
		foreach ($fh as $element) 
		{
			list($field1, $field2, $field3) = explode(",", $element);
			$field3 = str_replace(array("\r", "\n"), '', $field3); //entfernt Zeilenumbruch
			if ($i==1)
			{
			
				fputs($resultfile,trim($field1,"\"").";\r\n".trim($field2,"\"").";\r\n".trim($field3,"\"").";\r\n");
			}
			if ($i>1)
			{
			fputs($resultfile,trim($field1,"\"").";".trim($field2,"\"").";".trim($field3,"\"").";");
			
			}
			
			
			
			$i++;
		}

		echo "Konvertierung erfolgreich";
		fclose($resultfile);
		unset($fh); # Delete Array
 
Zuletzt bearbeitet:
Wenn ich das jetzt alles richtig verstanden habe, könnte das hier die Lösung sein:

PHP:
<?
$datei = fopen("testdatei.txt", "r");

$felder = fgetcsv($datei, 1000, ";");	// Feldnamen ermitteln
$anzahl = count($felder);			// Anzahl der Felder speichern

while ($inhalt = fgetcsv($datei, 1000, ";")) {
	for ($a = 0; $a < $anzahl; $a++) {
		echo $felder[$a] .": " .$inhalt[$a] ."<br>";
	}
	echo "<br>";
}
?>

Hab das jetzt mit folgenden Daten versucht:

"Feld1"; "Feld2"; "Feld3"; "Feld4"; "Feld5"
"Datenreihe 1 - 1"; "Datenreihe 1 - 2"; "Datenreihe 1 - 3"; "Datenreihe 1 - 4"; "Datenreihe 1 - 5"
"Datenreihe 2 - 1"; "Datenreihe 2 - 2"; "Datenreihe 2 - 3"; "Datenreihe 2 - 4"; "Datenreihe 2 - 5"

und die Ausgabe ist wie folgt:

Feld1: Datenreihe 1 - 1
Feld2: Datenreihe 1 - 2
Feld3: Datenreihe 1 - 3
Feld4: Datenreihe 1 - 4
Feld5: Datenreihe 1 - 5

Feld1: Datenreihe 2 - 1
Feld2: Datenreihe 2 - 2
Feld3: Datenreihe 2 - 3
Feld4: Datenreihe 2 - 4
Feld5: Datenreihe 2 - 5

Gruß Thomas
 
Besten Dank.

Genau so soll es sein.
Allerdings besteht noch ein kleines Problem mit den Anführungszeichen.

Wenn der Inhalt eines Feldes z.B dieser ist:

Code:
"Data2: String="xyz" fertig"

Dann steht der Konvertierung folgendes in der Datei:

Code:
Data2: String=xyz" fertig"

Das ist natürlich falsch. Die äußeren Anführungszeichen müssen weg sein. (Funkiton trim) Aber die inneren um das "xyz" müssen erhalten bleiben.



PHP:
$fh = fopen($argv[1], "r");
$resultfile=fopen("konvertiert_zu_line.txt","w");

$felder = fgetcsv($fh, 1000, ",");    // Feldnamen ermitteln
$anzahl = count($felder);            // Anzahl der Felder speichern

while ($inhalt = fgetcsv($fh, 1000, ",")) {
    for ($a = 0; $a < $anzahl; $a++) {
        fputs($resultfile,$felder[$a] .";" .trim($inhalt[$a],"\"") ."\r\n");
    }
    fputs($resultfile,"\r\n");
} 

		echo "Konvertierung erfolgreich";
		fclose($fh);
		fclose($resultfile);
 
Gut dann machen wir es anders:

PHP:
while ($inhalt = fgetcsv($datei, 1000, ",", "#")) {
	for ($a = 0; $a < $anzahl; $a++) {
		echo $felder[$a] .": " .substr($inhalt[$a], 1, strlen($inhalt[$a]) - 2) ."<br>";
	}
	echo "<br>";
}

Bei den Parametern der fgetcsv-Anweisung wird "#" als das Zeichen angegeben in welches der Text eingeschlossen ist. Es sollte/müßte ein Zeichen sein, das in Wirklichkeit nicht in der Datei enthalten ist.
Das hat zur Folge, dass das doppelte Anführungszeichen beim Einlesen nicht entfernt wird.

Gruß Thomas
 
Habe gerade einmal bisschen getestet und versucht das ganze auch wieder in die andere Richtung zu erstellen.
Dabe ist mir noch ein Fehler aufgefallen.

Die Ausgabe ist falsch.
So soll es nicht sein:

Code:
Feld1: Datenreihe 1 - 1
Feld2: Datenreihe 1 - 2
Feld3: Datenreihe 1 - 3
Feld4: Datenreihe 1 - 4
Feld5: Datenreihe 1 - 5

Feld1: Datenreihe 2 - 1
Feld2: Datenreihe 2 - 2
Feld3: Datenreihe 2 - 3
Feld4: Datenreihe 2 - 4
Feld5: Datenreihe 2 - 5

So ist es richtig.

Code:
Feld1: Datenreihe 1 - 1 : Datenreihe 2 - 1...
Feld2: Datenreihe 1 - 2 : Datenreihe 2 - 2...
Feld3: Datenreihe 1 - 3 : Datenreihe 2 - 3...
Feld4: Datenreihe 1 - 4 : Datenreihe 2 - 4...
Feld5: Datenreihe 1 - 5 : Datenreihe 2 - 5...

Ich hasse diesen Konvertierungskram.
 
Neues Spiel, neues Glück:

PHP:
<?
$datei = fopen("testdatei.txt", "r");

$felder = fgetcsv($datei, 1000, ",");	// Feldnamen ermitteln
$anzahl = count($felder);			// Anzahl der Felder speichern

// neuen String bilden
while ($inhalt = fgetcsv($datei, 1000, ",", "#")) {
	for ($a = 0; $a < $anzahl; $a++) {
		$neu[$a] = $neu[$a] .substr($inhalt[$a], 1, strlen($inhalt[$a]) - 2);

		if (!feof($datei)) $neu[$a] = $neu[$a] . " : ";
	}
}

// Gebildete Daten ausgeben
for ($a = 0; $a < $anzahl; $a++) {
	echo $felder[$a] .": " .$neu[$a] ."<br>";
}
	echo "<br>";
?>

Ausgabe:

Feld1: Datenreihe 1 - 1 : Datenreihe 2 - 1 : Datenreihe 3 - 1
Feld2: Datenreihe 1 - 2 : Datenreihe 2 - "Reihe 2" : Datenreihe 3 - 2
Feld3: Datenreihe 1 - 3 : Datenreihe 2 - 3 : Datenreihe 3 - 3
Feld4: Datenreihe 1 - 4 : Datenreihe 2 - 4 : Datenreihe 3 - 4
Feld5: Datenreihe 1 - 5 : Datenreihe 2 - 5 : Datenreihe 3 - 5


SORRY, musste noch was ändern. Bei der ersten Version war ein Doppelpubkt zu viel.
 
Zuletzt bearbeitet:
Zurück