Anzeige

 CSV Datei in Excel ausgeben und filtern


B

ByeBye 274521

#1
Hi,

Ich komme nicht weiter und bräuchte einige Hilfe.

Mein Code:

PHP:
<?php

            $row = 1;                                   
            $handle = fopen ("beispiel2.csv","r");           
            while ( ($data = fgetcsv ($handle, 1000, ",")) !== FALSE ) {

               $num = count ($data);                  
               print "<p> $num fields in line $row: <br>\n";
               $row++;                                
               for ($c=0; $c < $num; $c++) {         
                   print $data[$c] . "<br>\n";        
               }
            }
            fclose ($handle);

            ?>
Die CSV Datei wird richtig ausgelesen. Der gibt mir die Richtigen Zeilen und die Spalten dazu. Nur möchte ich das er mir die 1. Spalte filtert. Z.b. Die erste Zeile ist "ArtikelNumberCustomer". Wird in "Pizza123", "Döner123", "Pizza134", u.s.w. dargestellt. Und ich möchte das in einer Excel Datei mir alle die mit Pizza... anfangen zusammen filtert und ausgibt. Wie kann ich das hinbekommen?

Gruß
JQCan
 
#2
Eine Spalte wird in Pizza und Döner dargestellt? Also als Kuchendiagramm? Sorry, ich verstehe nicht was du da hast und was du willst.
Mach bitte mal ein Beispiel. WIe sieht das CSV aus. Und was willst du als Resultat (in tabelarischer Form).

Und sehe ich das Richtig? Das Resultat soll nicht angezeigt werden sondern das eine Exceldatei (Endung .xlsx) erstellt wird?
 
B

ByeBye 274521

#3
Genau. Es wird eine Spalte die heißt ArtikelNumberCustomer als "Pizza123", "Döner123", Pizza132", Pizza223, "Pasta000", "Döner444" dargestellt. In CSV Datei!
Ich möchte jetzt das die Werte die in CSV Datei sind in einer Exceldatei (Endung .xlsx) erstellt. Richtig. Aber Ich habe als dropdown menü Customer, da sind aufgelistet "Pizza", "Döner", Pasta", "Salat". Und wenn ich im Dropdown die "Pizza" wähle und denn den Button "Datei als Excel erstellen" klicke, soll der mir aus der CSV Datei nach Customer Pizza filtern und ausgeben in einer .xlsx. Wäre das denn machbar?
Habe eine Übung in der Uni bekommen und kriege dies nicht so ganz hin.

Die CSV Datei: (ich habe dies etwas verkürzt)
ArtikelNumberCustomer, ArtikelPreis, ArtikelZutaten, ArtikelExtrasBeilagen
"Pizza123, 12.22, Thunfisch, Mais"
"Pizza223, 4.50, Salami, Mais"
"Döner123, 3.50, Lammfleisch, Peperonie"
"Salat998, 8.99, Eier, Frühlingszwiebeln"
 
#4
Für die Filterung habe ich dir eine Möglichkeit.
Ich habe in meiner Testumgebung nicht die Möglichkeit Dateien zu hinterlegen. Darum ist meine CSV alsVariable drin.
Ab $data kannst du sozusagen übernehmen

PHP:
<pre>
<?php
//Test-CSV
$txt = <<<TXT
ArtikelNumberCustomer,Anzahl
Pizza123,1
Döner456,2
Pizza789,5
TXT;

//Testeingabe
$search = 'Pizza';

$rows = explode("\n", $txt);
$result = array();
//Header auslesen
$result[] = str_getcsv($rows[0], ',');

//Daten durchiterieren
foreach($rows as $line){
	$data = str_getcsv($line, ',');
	if(preg_match("/^{$search}/i", $data[0])) $result[] = $data;
}

var_dump($result);

?>
</pre>
Testresultat
Code:
array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(21) "ArtikelNumberCustomer"
    [1]=>
    string(6) "Anzahl"
  }
  [1]=>
  array(2) {
    [0]=>
    string(8) "Pizza123"
    [1]=>
    string(1) "1"
  }
  [2]=>
  array(2) {
    [0]=>
    string(8) "Pizza789"
    [1]=>
    string(1) "5"
  }
}
Und wie du das ins Excel bringst, gibt es diverse Anleitungen und dazu passende Bibliotheken im Netz. Google nach 'php export to xlsx'
 
B

ByeBye 274521

#5
Einen Guten Rutsch wünsche ich euch allen!

Vielen Dank Yaslaw!

Ich habe einiges ausprobiert.
Mein Code:
Code:
if ( ($datei = fopen("test.csv", "r")) != FALSE) {
                //Für jede Zeile die fgetcsv zurückgibt
                while (($zeile = fgetcsv($datei, 1000, ",")) != FALSE) {
                  
                    $search = 'Pizza';  
                    $result = array();
                  
                    //Header auslesen
                    $result[] = str_getcsv($zeile[0], ',');
                    //Daten durchiterieren
                    foreach ($zeile as $line) {
                        $data = str_getcsv($line, ',');
                        if (preg_match("/^{search}/i", $data[0]))
                            $result[] = $data;
                    }
                  
                    var_dump($result);
                }
                //Datei schliesen
                fclose($datei);
            }
Meine kleine test.csv sieht so auch:
Code:
ArtikelNumber Customer,ArtikelPreis,ArtikelZutaten,SKU,ArtikelExtrasBeilagen
"Pizza123,""12,22 €"",Thunfisch,Mais"
"Salat103,""12,50 €"",Thunfisch,Frühlingszwiebeln"
"Pizza223,""4,50 €"",Salami,Mais"
"Salat123,""8,50 €"",Eier,Frühlingszwiebeln"
Nur ich kann nicht ganz verstehen, wieso mir alle Daten ausgibt.
Meine Ausgabe:
Code:
array(1) { [0]=> array(1) { [0]=> string(22) "ArtikelNumber Customer" } } array(1) { [0]=> array(4) { [0]=> string(8) "Pizza123" [1]=> string(10) "12,22 €" [2]=> string(9) "Thunfisch" [3]=> string(4) "Mais" } } array(1) { [0]=> array(4) { [0]=> string(8) "Salat103" [1]=> string(9) "12,50 €" [2]=> string(9) "Thunfisch" [3]=> string(18) "Frühlingszwiebeln" } } array(1) { [0]=> array(4) { [0]=> string(8) "Pizza223" [1]=> string(8) "4,50 €" [2]=> string(6) "Salami" [3]=> string(4) "Mais" } } array(1) { [0]=> array(4) { [0]=> string(8) "Salat123" [1]=> string(8) "8,50 €" [2]=> string(4) "Eier" [3]=> string(18) "Frühlingszwiebeln" } }
Kann mir einer helfen?

Danke euch!

LG
JQCan
 

Yaslaw

n/a
Moderator
#6
beim preg_match hast du vor search ein $ vergessen. SO wird nie nach deinen Suchbegriff gesucht.

Du hast allgemein ein Chaos. Das sollte glaub etwa reichen
PHP:
$datei = fopen("test.csv", "r")

//Suchbegriff und Resultat-Array vor der Schleife definieren
$search = 'Pizza';  
$result = array();
//Für jede Zeile die fgetcsv zurückgibt
while ($data  = fgetcsv($datei, 1000, ',', '"')) !== FALSE) {
    //In jeder Zeil prüfen, ob die Spalte 0 dem Suchbegriff entspricht
    if (preg_match("/^{$search}/i", $data [0])) $result[] = $data ;
}
//Datei schliesen
fclose($datei);
 
B

ByeBye 274521

#7
Danke dir!

Habe dies mal ausprobiert, aber irgendwie gibt der mir Array(0) {} aus.

Ich habe mal komplett anders implementiert und dies scheint auch zu funktionieren. Nur liegt jetzt das Problem bei den Euro-Zeichen.

Hier mein neuer Code:
PHP:
if ( ($datei = fopen("test.csv", "r")) != FALSE) {
                 $fp = fopen('test.csv', 'w');
                  
                //Für jede Zeile die fgetcsv zurückgibt
                while (($zeile = fgetcsv($datei, 1000, ",")) != FALSE) {
               
                 $anzahlSpalten = count($zeile);
               
                   for ($c = 0; $c < $anzahlSpalten; $c++) {
         
                                if (preg_match('/^Pizza/i', $zeile[$c]) > 0) {
                                    $data[$c] = utf8_decode($zeile[$c]); //Umlaute müssen richtig importiert werden
                                    $current .= fputcsv($fp, $data);
                                } 
                    }
                }
                //Datei schliesen
                fclose($datei);
            }
Jetzt gibt er mir die Pizzen in test.csv richtig aus. Nur das Problem ist jetzt beim "€". ich bekomme eine Ausgabe: "12,22 ?"
Wie kann ich das Euro-Zeichen richtig ausgeben? Die Ergebnisse können als CSV oder Excel Datei heruntergeladen werden! Ich habe dies in CSV geschrieben.
Ich habe nach dem Problem gegoogelt. Und einiges ausprobiert, aber bin nicht mehr schlauer geworden. Es liegt wohl an dem "fputcsv". Dies wird nicht richtig kodiert.
Mit iconv() hat es auch nicht funktioniert. :-(

LG
 

Yaslaw

n/a
Moderator
#8
Du hast test.csv 2 mal geöffnet. Einmal Lesen und einmal schreiben. Nicht nett.

Im If würde ich den for verlassen (break;). Wenn Pizza in 2 Feldern vorkommt, so schreibt es die Zeile 2 mal in die Zieldatei.

Sorrym beim eigentlichen €-Problem kann ich nicht helfen. Ich habe kein PHP zur Hand.
 
B

ByeBye 274521

#9
Ach ohjeee... stimmt. Normal sollten die beiden test.csv Dateien nicht für Schreiben und Lesen zusammen geschehen.
Ok!
hmm wegen dem €-Problem werde ich nicht fundig :-(

Hoffe es kann mir einer ein Tipp geben.
 
B

ByeBye 274521

#10
Problem gelöst.
Habe dies mit der "mb_convert_encoding()" gelöst. Jetzt werden Umlaute und € Zeichen richtig als csv Datei ausgegeben.

Danke nochmals an alle die mir etwas geholfen haben!
 
Anzeige
Anzeige