array_unique funktioniert nicht, weil CSV-Felder auch Zeilenumbrüche enthalten dürfen. Das mag in Verbindung mit file eine Lösung sein, aber es ist keine Lösung.
Ankündigung
Einklappen
Keine Ankündigung bisher.
gleiche Einträge ignorieren
Einklappen
Neue Werbung 2019
Einklappen
X
-
Ich habe mir mal erlaubt, die Testdaten so (um zwei Citroen-Zeilen) zu erweitern, dass sie sinnvoll für den Anwendungsfall sind, wie ich ihn verstanden habe.
Das ist aber wirklich eine Aufgabe, die man als Fragesteller selbst übernehmen darf. Ich musste zweimal fragen, und dann waren die Daten immer noch nicht wirklich doll. Leute, bitte. Denkt mit! Wir sind hier definitiv in der Lage, euch bei so überschaubaren Sachen zu helfen, aber es ist ziemlich öde, wenn man sich das dann selbst noch zusammendichten darf. Welche Ausgabe du genau willst, hast du noch immer nicht als Beispiel gepostet. Ich habe es hier jetzt mal so implementiert, wie ich es verstanden habe. Wie gesagt: Eine durchdachte Beispielausgabe ist im Zweifel eine sehr gute Ergänzung zu einer wörtlichen Beschreibung. Man sieht dann, was Sache ist.
PHP-Code:<?php
$csvFile = <<<'EOT'
Bergfeld;1;0;4;Citroen;AG 2451;;;;;;;;;;;;;;;;;;;;;;;;;;
Grüze;1;0;4;Toyota;AG 2563;;;;;;;;;;;;;;;;;;;;;;;;;;
Grüze;1;0;5;Audi;AG 4698563;;;;;;;;;;;;;;;;;;;;;;;;;;
Seefeld;1;0;4;Citroen;AG 2452;;;;;;;;;;;;;;;;;;;;;;;;;;
Stettbach;1;0;5;Lancia;AG 985642;;;;;;;;;;;;;;;;;;;;;;;;;;
Seen;1;0;4;VW;AG 1200560;;;;;;;;;;;;;;;;;;;;;;;;;;
Seen;1;0;4;Ford;AG 5526620;;;;;;;;;;;;;;;;;;;;;;;;;;
Waldfeld;1;0;4;Citroen;AG 2453;;;;;;;;;;;;;;;;;;;;;;;;;;
EOT;
$handle = fopen('data://text/plain;base64,' . base64_encode($csvFile), 'rb');
// Kann auch eine Datei sein. Habe ich nur für das Beispiel inline
// geschrieben. Siehe: http://php.net/manual/en/wrappers.data.php
$data = array();
while ($row = fgetcsv($handle, 0, ';')) {
$data[] = $row;
}
// Sortiert
// 1. Nach der Spalte mit Toyota, Audi und so
// 2. Nach Autonummer (Spalte danach, ABER ALS STRING, NICHT ALS ZAHL)
usort($data, function ($a, $b) {
$tmp = strcmp($a[4], $b[4]);
if ($tmp !== 0) {
return $tmp;
}
return strcmp($a[5], $b[5]);
});
foreach ($data as $d) {
printf("%s\n", implode('.', $d));
}
// Grüze.1.0.5.Audi.AG 4698563..........................
// Bergfeld.1.0.4.Citroen.AG 2451..........................
// Seefeld.1.0.4.Citroen.AG 2452..........................
// Waldfeld.1.0.4.Citroen.AG 2453..........................
// Seen.1.0.4.Ford.AG 5526620..........................
// Stettbach.1.0.5.Lancia.AG 985642..........................
// Grüze.1.0.4.Toyota.AG 2563..........................
// Seen.1.0.4.VW.AG 1200560..........................
// Ausgabe nach Automarke gruppiert:
$groupByColumn = function ($data, $columnIndex) {
$grouped = array();
foreach ($data as $d) {
if (!array_key_exists($d[$columnIndex], $grouped)) {
$grouped[$d[$columnIndex]] = array();
}
$grouped[$d[$columnIndex]][] = $d;
}
return $grouped;
};
foreach ($groupByColumn($data, 4) as $key => $value) {
printf("%s\n", $key);
foreach ($value as $v) {
printf(" - %s\n", implode('.', $v));
}
}
// Audi
// - Grüze.1.0.5.Audi.AG 4698563..........................
// Citroen
// - Bergfeld.1.0.4.Citroen.AG 2451..........................
// - Seefeld.1.0.4.Citroen.AG 2452..........................
// - Waldfeld.1.0.4.Citroen.AG 2453..........................
// Ford
// - Seen.1.0.4.Ford.AG 5526620..........................
// Lancia
// - Stettbach.1.0.5.Lancia.AG 985642..........................
// Toyota
// - Grüze.1.0.4.Toyota.AG 2563..........................
// VW
// - Seen.1.0.4.VW.AG 1200560..........................
Kommentar
-
Ganz herzlichen Dank für die Hilfe.
Ich habe das nun zwei Stunden probiert, aber irgendetwas mache ich noch immer falsch. Es kommt immer Fehlermeldung, dass die 5 und 4 undefined offset seien:
Ich habe nun mal die Automarken schon getrennt. Das funktioniert. Wie kann ich nun aber in diesem Code noch die Autonummern sortieren?
PHP-Code:<?php
if (($handle = fopen("daten.csv", "r")) !== FALSE) {
fgets($handle); // Erste Zeile überlesen
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// $data= array();
echo "\n";
if ($data[4]=='Citroen') {
echo "<table width=800> <td width=70>$data[1]</td><td width=70>$data[2] </td> <td width=30>$data[3] </td> <td width=30>$data[4]</td> <td width=90>$data[5] </td> </table> ";
}
}
fclose($handle);
}
?>
Citroen AG 2569
Citroen AG 1268
Citroen AG 589642
Hier möchte ich noch nach Nummern sortieren. Könnte sonst AG auch weglassen, wenn es dann besser ginge. Wie mache ich das nun im obigen Code?
Vielen Dank für eure Geduld!
Kommentar
-
Hallo zusammen.
Ich bin leider immer noch nicht weiter. Ich versuchte den ganzen Tag die Lösung von mermshaus einzubauen, aber ich schaffe es nicht.
Ich habe wenigstens geschafft, dass die Array Warnung nicht mehr kommt, aber ich möchte doch nur nach der 5. Spalte sortieren, aber das schaffe ich einfach nicht. Mein Code:
PHP-Code:<?php
if (($handle = fopen("daten.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
echo "\n";
$var=array($data[5]);
ksort ($var);
if ($data[4]=='Citroen') {
echo "<table width=800> <td width=70>$data[1]</td><td width=70>$data[2] </td> <td width=30>$data[3] </td> <td width=30>$data[4]</td> <td width=90>$var </td> </table> ";
}
}
fclose($handle);
}
?>
Vielen Dank für eure Hilfe!
Kommentar
-
Du kannst die CSV erst mal in eine sqlite-inMemory-Tabelle ziehen und da dann deine Anforderung umsetzen:
PHP-Code:$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE tabelle ...');
$stmt = $pdo->prepare('INSERT INTO tabelle (feld1, feld2, feld3, feld4, ...) VALUES (?, ?, ?, ?, ...)');
$file = new SplFileObject("data.csv");
while (!$file->eof()) {
$fields = $file->fgetcsv(',', '"');
$stmt->execute($fields);
}
/* ... */
Kommentar
-
Bin nun wieder einen Schritt weiter, aber ich komme einfach nicht zum richtigen Schluss:
PHP-Code:<?php
if (($handle = fopen("daten.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
echo "\n";
$var=array($data[5]);
usort($var, "strnatcmp");
var_dump ($var[0]); echo '<p>'; // ergibt z.B. string(5) "45685"
var_dump ($var); echo '<p>'; // ergibt z.B. array(1) { [0]=> string(5) "45685" }
echo ($var[0]); // ergibt z.B. 45685
if ($data[4]=='Citroen') {
echo "<table width=800> <td width=70>$data[1]</td><td width=70>$data[2] </td> <td width=30>$data[3] </td> <td width=30>$data[4]</td> <td width=90>$var </td> </table> ";
}
}
fclose($handle);
}
?>
Kommentar
-
Zitat von ChristianK Beitrag anzeigenNimm eine Datenbank dazwischen.
Btw. Arrays notiert man so: $array[$i] nicht so $array{$i} !
Halte dich an den Post von mermshaus, wenn du das in PHP machen willst. Das übersteigt deine Kompetenzen jedoch vermutlich. Deshalb empfehle ich dir, eine temporäre Tabelle zu nutzen wie von rkr vorgeschlagen und die Datenbank sortieren zu lassen. Das ist einfacher.[URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]
Kommentar
Kommentar