CSV Zeile welche Suchwort enthält löschen

GI-Joe

Grünschnabel
Hallo,

ich bin dabei eine *.csv nach Suchwörten zu durchsuchen. Wenn dieses Suchwort auftaucht soll die komplette Zeile entfernt werden. Nur leider klappt diese Variante hier nicht, das Suchwort wird nicht gefunden (obwohl vorhanden) bzw. die Zeile(n) wird /werden nicht entfernt.

PHP:
<?php
$dateipfad = "csv/test.csv";
$dateiinhalt = file($dateipfad);

$suchmuster = '/^suchwort1/';
$neuerInhalt = "";

foreach ( $dateiinhalt as $zeile ) {
if ( !preg_match($suchmuster, $zeile) ) {
$neuerInhalt.= $zeile;
}
}

file_put_contents($dateipfad, $neuerInhalt); 

?>

Hat jemand eine Idee was ich da falsch mache? Für Hilfe wäre ich dankbar.
 
Mit dem ^ im Pattern suchst du nur am Zeilenanfang.

Ich würde mit str_getcsv() die Zeile in Zellen splitten. Dann die gewünschte Zelle vergleichen.
 
Hi,

danke für die schnelle Reaktion. Leider kenn ich diese Funktion str_getcsv nicht wirklich. Ich denke da muss ich noch dazulernen. Lassen sich dabei auch mehrere Suchworte filtern?
 
str_getcsv() splitetdie csv-Zeile in ein Array auf. Dann hast du allemöglichenn Array-Funktionen zur verfügung

Ein kleines Beispiel auf die Schnelle
PHP:
//CSV-Zeilen. ID;Vorname;Nachname;Ort;Text mit ;
$csvLines=array(
    '1;Hans;Müller;Winterthur;"text1;text2"',
    '2;Marian;Müller;Winterthur;"abc;de"',
    '3;Müller;Thomas;Winterthur;""',
    '4;Eva;Müller;Zürich;""'         
);

//Suchen nach Feld 2 (Nachname) und 3 (Ort)
$searchA = array(2 => "Müller", 3 => "Winterthur");

$newCsv = array();
foreach($csvLines as $csvLine){
    $fields = str_getcsv($csvLine, ";");
    print_r($fields);
    //Ermittelt die Schnittmenge mit Indexprüfung beider Arrays und vergleicht die Anzahlmitden Suchbegriffen
    if(count(array_intersect_assoc($fields, $searchA)) != count($searchA)) $newCsv[] = $csvLine;
}
print_r($newCsv);($newCsv);

Ergibt folgendes. Die erstenArrays sinddie aufgespliteten Zeilen, der letzte Array das gefilterte Resultat
Beachte, Bei ID 3 ist Müller der Vorname (wir suchen Müller im Nachnamen) und bei ID 4 ist der Ort falsch
Code:
Array
(
    [0] => 1
    [1] => Hans
    [2] => Müller
    [3] => Winterthur
    [4] => text1;text2
)
Array
(
    [0] => 2
    [1] => Marian
    [2] => Müller
    [3] => Winterthur
    [4] => abc;de
)
Array
(
    [0] => 3
    [1] => Müller
    [2] => Thomas
    [3] => Zürich
    [4] => 
)
Array
(
    [0] => 4
    [1] => Eva
    [2] => Müller
    [3] => Zürich
    [4] => 
)
Array
(
    [0] => 3;Müller;Thomas;Winterthur;""
    [1] => 4;Eva;Müller;Zürich;""
)
 
Leider lässt sich das so nicht ganz umsetzten, da die array's sehr umfangreich sind, die Datei hat knapp 600000 Zeilen.
Diese ist in etwa so aufgebaut und ändert sich täglich (ist eben ne Preisliste daher sind die array's täglich zum Teil anders):

Artikelnr;Titel;EAN;Kategorie;Beschreibung;IMG;Preis

Ich möchte nur ganze Zeilen entfernen welche der Kategorie XY angehören.
 
Der Array am Anfang ist nur als Beispiel
Du gehst ja die Zeilen durch und schreibst die Zeilen jeder zusammen.
Wobei den $dateiinhalt genauso ein Array ist, wie mein $csvLines

Ich gehe auch jede Zeile durch, zerlege sie und prüfe. Schreiben tu ich dann aber wieder die Zeile.

$newCsv[] = $csvLine
und nicht
$newCsv[] = $fields

Die ersten Arrays sind nur eine Zwieschenausgabe um zu verdeutlichen was geschieht. Das Resultat sieht ja so aus (letzter Array) und hat weniger Einträge als das Ursprungsarray
Code:
Array(
    [0] => 3;Müller;Thomas;Winterthur;""
    [1] => 4;Eva;Müller;Zürich;""
)

Lies mein Code mal genau durch
 
Zurück