CSV auslesen

Diskutiere CSV auslesen im PHP Forum im Bereich Programmierung; Hallo Zusammen. Möchte eine CSV auslesen und zusammenfassen. Habe jedoch einen Hänger und bekomme es nicht hin. Hier mal ein sample der .csv...
  • CSV auslesen Beitrag #1
T
Tom
Member
Beiträge
5
Punkte Reaktionen
0
Hallo Zusammen.

Möchte eine CSV auslesen und zusammenfassen. Habe jedoch einen Hänger und bekomme es nicht hin.
Hier mal ein sample der .csv:

04080057;"FXD 1340";1998
04080057;"FXD 1340";1997
04080057;"FXD 1340";1996
04080057;"FXD 1340";1995

04080057;"FXD 1440";2001
04080057;"FXD 1440";2000
04080057;"FXD 1440";2003
04080057;"FXD 1440";2002
04080057;"FXD 1440";1999
04080057;"FXD 1440";2004
04080057;"FXD 1440";2005

04080219;"FXDC 1340";1998
04080219;"FXDC 1340";1997
04080219;"FXDC 1340";1996
04080219;"FXDC 1340";1995

04080219;"FXDL 1440";2001
04080219;"FXDL 1440";2000
04080219;"FXDL 1440";2003
04080219;"FXDL 1440";2002
04080219;"FXDL 1440";1999
04080219;"FXDL 1440";2004
04080219;"FXDL 1440";2005

Das Ergebniss soll wie folgt aussehen:
04080057, FXD 1340 1995 - 1998, FXD 1440 1999 - 2005
04080219, FXDC 1340 1995 - 1998, FXDL 1440 1999 - 2005

Kann mir hier jemand Unterstützung geben?

Gruss
Thomas
 
  • CSV auslesen Beitrag #2
S
scatello
Well-known member
Beiträge
528
Punkte Reaktionen
44
ChatGPT lässt grüßen:
PHP:
<?php
$filename = 'data.csv'; // Name der CSV-Datei

$data = [];

// CSV-Datei einlesen
if (($handle = fopen($filename, 'r')) !== false) {
    while (($row = fgetcsv($handle, 1000, ';')) !== false) {
        $id = $row[0];
        $modell = trim($row[1], '"');
        $jahr = (int)$row[2];

        // Gruppieren nach ID und Modell
        $data[$id][$modell][] = $jahr;
    }
    fclose($handle);
}

// Auswertung und Ausgabe
foreach ($data as $id => $modelle) {
    $ausgabe = [$id];
    foreach ($modelle as $modell => $jahre) {
        sort($jahre);
        $von = min($jahre);
        $bis = max($jahre);
        $ausgabe[] = "$modell $von - $bis";
    }
    echo implode(', ', $ausgabe) . "<br>";
}
?>
 
  • CSV auslesen Beitrag #3
T
Tom
Member
Beiträge
5
Punkte Reaktionen
0
ChatGPT lässt grüßen:
PHP:
<?php
$filename = 'data.csv'; // Name der CSV-Datei

$data = [];

// CSV-Datei einlesen
if (($handle = fopen($filename, 'r')) !== false) {
    while (($row = fgetcsv($handle, 1000, ';')) !== false) {
        $id = $row[0];
        $modell = trim($row[1], '"');
        $jahr = (int)$row[2];

        // Gruppieren nach ID und Modell
        $data[$id][$modell][] = $jahr;
    }
    fclose($handle);
}

// Auswertung und Ausgabe
foreach ($data as $id => $modelle) {
    $ausgabe = [$id];
    foreach ($modelle as $modell => $jahre) {
        sort($jahre);
        $von = min($jahre);
        $bis = max($jahre);
        $ausgabe[] = "$modell $von - $bis";
    }
    echo implode(', ', $ausgabe) . "<br>";
}
?>
Hallo Scatello

Super - Vielen Dank, das ist genau die richtige Richtung.
Wenn ich bei echo implode(', ', $ausgabe) . "<br>"; die id nicht mit ausgeben möchte, wie ändere ich das?

Gruss
Thomas
 
  • CSV auslesen Beitrag #4
S
scatello
Well-known member
Beiträge
528
Punkte Reaktionen
44
Wenn ich bei echo implode(', ', $ausgabe) . "<br>"; die id nicht mit ausgeben möchte, wie ändere ich das?
Schon mal genau hingesehen, wo die ID in das Array $ausgabe eingetragen wird?
 
  • CSV auslesen Beitrag #5
T
Tom
Member
Beiträge
5
Punkte Reaktionen
0
:)
Schon gesehen.
Vielen Dank für Deinen Support.
 
  • CSV auslesen Beitrag #7
T
Tom
Member
Beiträge
5
Punkte Reaktionen
0
Hallo.
Ja, das mache ich ja auch. Hatte nur seit Gestern Abend kein Internet mehr.
 
  • CSV auslesen Beitrag #8
T
Tom
Member
Beiträge
5
Punkte Reaktionen
0
Hi Scatello.
Benötige nochmals Deine Hilfe. Habe noch zu viele Daten.
Es soll nur noch nach Modell ID und Modellname wie FLSTC oder FLSTCI und den Jahren sortiert/ausgelesen werden.

<?php
$filename = 'data.csv'; // Name der CSV-Datei
$data = [];
$finde = array('ABS', 'EFI'); // Gewisse Zeichen in ersetzten
$ersetze = array('', '');

// CSV-Datei einlesen
if (($handle = fopen($filename, 'r')) !== false) {
while (($row = fgetcsv($handle, 1000, ';')) !== false) {
$id = $row[0];
$modell = str_replace($finde, $ersetze,$row[10]);
$modell = preg_replace('/\d+/', '', $modell);
$modell = trim($modell, '"');
$jahr = (int)$row[14];

// Gruppieren nach ID und Modell
$data[$id][$modell][] = $jahr;
}
fclose($handle);
}

// Auswertung und Ausgabe
foreach ($data as $id => $modelle) {
$ausgabe = [$id];
foreach ($modelle as $modell => $jahre) {
sort($jahre);
$von = min($jahre);
$bis = max($jahre);
$ausgabe[] = "$modell $von - $bis";
}
echo implode(', ', $ausgabe) . "<br>";
}
?>


Inhalt der CSV:
9200062;FLSTC 1450;2003
9200062;FLSTC 1450;2000
9200062;FLSTC 1450;2001
9200062;FLSTC 1450;2002
9200062;FLSTC 1450;2004
9200062;FLSTC 1450;2005
9200062;FLSTC 1450 ABS;2005
9200062;FLSTC 1450 EFI;2005
9200062;FLSTC 1450;2006
9200062;FLSTC 1584;2008
9200062;FLSTC 1584;2009
9200062;FLSTC 1584;2007
9200062;FLSTC 1584;2010
9200062;FLSTC 1584;2011
9200062;FLSTC 1584 ABS;2011
9200062;FLSTC 1690;2013
9200062;FLSTC 1690;2012
9200062;FLSTC 1690 ABS;2012
9200062;FLSTC 1690 ABS;2013
9200062;FLSTC 1690 ABS;2016
9200062;FLSTC 1690 ABS;2015
9200062;FLSTC 1690 ABS;2014
9200062;FLSTC 1690 ABS;2017
9200062;FLSTC 1690 ABS;2013
9200062;FLSTCI 1450 EFI;2006
9200062;FLSTCI 1450 EFI;2005
9200062;FLSTCI 1450 EFI;2004
9200062;FLSTCI 1450 EFI;2003
9200062;FLSTCI 1450 EFI;2002
9200062;FLSTCI 1450 EFI;2001
4080057;FXD 1340;1998
4080057;FXD 1340;1997
4080057;FXD 1340;1996
4080057;FXD 1340;1995
4080057;FXD 1440;2001
4080057;FXD 1440;2000
4080057;FXD 1440 EFI;2000
4080057;FXD 1440 ABS;2000
4080057;FXD 1440;2003
4080057;FXD 1440;2002
4080057;FXD 1440;1999
4080057;FXD 1440;2004
4080057;FXD 1440;2005
4080219;FXDC 1340;1998
4080219;FXDC 1340;1997
4080219;FXDC 1340;1996
4080219;FXDC 1340;1995
4080219;FXDL 1440;2001
4080219;FXDL 1440;2000
4080219;FXDL 1440;2003
4080219;FXDL 1440;2002
4080219;FXDL 1440;1999
4080219;FXDL 1440;2004
4080219;FXDL 1440;2005

Ergebnis:
9200062, FLSTC 2000 - 2013, FLSTC 2005 - 2017, FLSTCI 2001 - 2006
4080057, FXD 1995 - 2005, FXD 2000 - 2000
4080219, FXDC 1995 - 1998, FXDL 1999 - 2005

Als Ergebnis bräuchte ich aber:
9200062, FLSTC 2000 - 2017, FLSTCI 2001 - 2006
4080057, FXD 1995 - 2005
4080219, FXDC 1995 - 2005

Also sollen die Zahlen und Bezeichnungen wie ABS, EFI ignoriert werden.
Habe es wie folgt versucht, haut aber nicht hin:

$finde = array("ABS", "EFI"); // Gewisse Zeichen in ersetzten
$ersetze = array("", "");
$id = $row[0];
$modell = str_replace($finde, $ersetze,$row[10]);
$modell = preg_replace('/\d+/', '', $modell);
$modell = trim($modell, '"');
$jahr = (int)$row[14];
 
Zuletzt bearbeitet:
  • CSV auslesen Beitrag #9
S
scatello
Well-known member
Beiträge
528
Punkte Reaktionen
44
Wenn du das hier befolgst, sollte dir einige klarer werden:

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
Vor allem Punkt 5 ist interessant (ohne den MySQL-Teil)
 
  • CSV auslesen Beitrag #10
N
Nitrosamin
New member
Beiträge
3
Punkte Reaktionen
0
Was auch noch hinzu kommt, Das lernen der Materie.
 
Thema:

CSV auslesen

Oben Unten