Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PHP] Filtrowanie zawartości pliku CSV wg. kategorii

toma5z 23 Maj 2010 10:38 3556 9
  • #1 23 Maj 2010 10:38
    toma5z
    Poziom 13  

    Witajcie mam pewien problem z php + plikiem csv.

    Chcę by zawartość pliku csv była wyświetlana wg. danych kryterii podawanych w formularzu html. Czyli wybieramy kategorię "Piwo" i wszystko co jest związane z piwem, z pliku csv nam sie wyświetla. Tak samo dla innych kategorii.

    Formularz html "leci" do php gdzie wyświetla przefiltrowane dane csv.

    Przedstawię to na przykładzie

    Mamy dany formularz html:

    Code:
    <BODY>
    
       <center><BR />
       <B> SKLEP MONOPOLOWY - SMAKOSZ</B>
       <BR /><BR />
       <form action="tabela.php" method="post">
       Twoje imię <input type="text" name="imie" size="10" maxlength="10"><BR/>
       Wybierz kategorie:<br />
        <input type="checkbox" name="Piwo" value=1/>Piwo<br/>
       <input type="checkbox" name="Wódka" value=1/>Wódka<br/>
        <input type="checkbox" name="Wytrawne" value=1/>Trunki Wytrawne<br/>
        <input type="submit" value="pokaz tabele"/>
       </center>
    </BODY>


    Plik tabela.php:
    Code:
    <BODY>
    
       <center><BR />
       <B> SKLEP MONOPOLOWY - SMAKOSZ</B>
       <BR /><BR />
       <?php
       $imie = $_POST['imie'];
       $Piwo = $_POST['Piwo'];
       $Wódka = $_POST['Wódka'];
       $Wytrawne = $_POST['Wytrawne'];
       echo 'Witaj: '.$imie.' !<br />';
       echo 'Oferta Specjalna dla Ciebie !<br /><br />';
       echo 'wybrałes kategorie : ';
       
       if ($Piwo == 1)
       {
       echo ' Piwo ';
       }
       if ($Wódka == 1)
       {
       echo ' Wódka ';
       }
       if ($Wytrawne == 1)
       {
       echo ' Trunki Wytrawne ';
       }
       
       echo '<table border="1" width="500"><tr><td><center>'.
       $plik = fopen("tabela.csv","r");
       $row = 3;
       while(!feof($plik))
       {
             $data = fgetcsv($plik,1000,"*");
                $num = count($data);




                echo '<br/>';
             $row++;
             
             if ($data != 'Piwo')
             {
             
                for ($c=0; $c < $num; $c++)
                {
                   echo $data[$c] . "<br />\n";
                }
             }
             else if ($data != $Wódka && $Wódka == 1)
             {
             for ($c=0; $c < $num; $c++)
                {
                   echo $data[$c] . "<br />\n";
                }
             }
             else if ($data != 'Wytrawne')
             {
             
                for ($c=0; $c < $num; $c++)
                {
                   echo $data[$c] . "<br />\n";
                }
             }
             
             
       }
          
       fclose($plik)
       .'</center></td></tr></table>';
       ?>
       </table>
       <br />
       <a href="index.html"> Back </a>
       </center>
    </BODY>


    Plik tabela.csv
    Code:
    Piwo, Tyskie Gronie, 2,40zl,
    
    Piwo, Tyskie Książęce, 2,60zl,
    Wódka, Absolwent0,7, 29zl,
    Wódka, GorzkadeLuxe0,5 , 20zl,
    Wytrawne, ZłotaTequilla, 127zl
    Wytrawne, Jacobsen, 1200zl,



    Mam problem z php, nie mam pojęcia jak zrobić daną filtrację csv.
    Ww. sposób, przeze mnie nie działa, kombinowałem na 3 warianty.

    Proszę o pomoc.

    0 9
  • #3 23 Maj 2010 11:58
    toma5z
    Poziom 13  

    ok, czyli w jaki sposób mam to zrobić ?

    nie ma jakiejś wbudowanej funkji w php do sprawdzania rekordów csv ?

    0
  • #5 28 Maj 2010 20:29
    toma5z
    Poziom 13  

    Hmmm... męcze dalej, proszę o pomoc.

    Gdzie to mam konkretnie uzyć ?

    Code:
    while(!feof($plik)) 
    
       {
             $data = fgetcsv($plik,1000,"*");
                $num = count($data);
                echo '<br/>';
             $row++;
             
             if ($data[0]=='Piwo')
             {
             
                for ($c=0; $c < $num; $c++)
                {
                    print_r($data);
                }
             }
       }


    w taki sposob mi to nie działa...

    0
  • Pomocny post
    #7 28 Maj 2010 22:44
    marcinj12
    Poziom 40  

    Po pierwsze: lepiej przekazuj kategorię jako tablicę, raz że będzie łatwiej jesli dojdzie jakaś nowa, dwa - że potem nie musisz sprawdzać każdej z osobna.
    Przerobione pliki mogą wyglądać np. tak:
    --Plik index.html

    Code:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <meta http-equiv="Content-Language" content="pl">
    </head>
    <BODY>
       <center><BR />
       <B> SKLEP MONOPOLOWY - SMAKOSZ</B>
       <BR /><BR />
       <form action="tabela.php" method="post">
       Twoje imię <input type="text" name="imie" size="10" maxlength="10"><BR/>
       Wybierz kategorie:<br />
        <input type="checkbox" name="kategoria[]" value="Piwo"/>Piwo<br/>
       <input type="checkbox" name="kategoria[]" value="Wódka"/>Wódka<br/>
        <input type="checkbox" name="kategoria[]" value="Wytrawne"/>Trunki Wytrawne<br/>
        <input type="submit" value="pokaz tabele"/>
       </center>
    </BODY>
    </html>


    --Plik tabela.php
    Code:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <meta http-equiv="Content-Language" content="pl">
    </head>
    <BODY>
       <center><BR />
       <B> SKLEP MONOPOLOWY - SMAKOSZ</B>
       <BR /><BR />
       <?php

       $imie = $_POST['imie'];
       
       if (isset($_POST['kategoria'])) $kategorie = $_POST['kategoria'];
       
       if (empty($kategorie))
       {
          echo 'Nie wybrałeś żadnej kategorii<br /><a href="index.html"> Back </a>
       </center>';
          return;
       }

       echo 'Witaj: '.$imie.' !<br />';
       echo 'Oferta Specjalna dla Ciebie !<br /><br />';
       echo 'wybrałes kategorie : ';
       
       foreach ($kategorie as $value)
       {
           echo $value. ", ";
       }
       unset($value);
       
       echo '<table border="1" width="500">';

       $plik = fopen("tabela.csv","r");
       $row = 1;
       while(($data = fgetcsv($plik, 1000,"\t")) !== False)
       {
         $data[0] = str_replace("\xef\xbb\xbf", '', $data[0]);  //zastępuje 3 znaki BOM dla UTF-8
         if (in_array($data[0], $kategorie))
         {
            echo "<tr><td>$row</td><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td></tr>";
            $row++;
         }
       }
         
       fclose($plik);

       echo '</center></td></tr></table>';
       ?>
       </table>
       <br />
       <a href="index.html"> Back </a>
       </center>
    </BODY>
    </html>

    Poniewąż plik zapisałem sobie w UTF-8, wprowadziłem dodatkową linijkę rozwiązującą problem z nagłówkiem. W innym kodowaniu problem może nie istnieć.
    Założyłem że swój plik csv jest rozdzielany tabulatorami.

    Zmodyfikuj ewentualnie do swoich potrzeb...

    Pozdrawiam

    0
  • #8 11 Cze 2010 22:33
    toma5z
    Poziom 13  

    Dziękuje za pomoc !
    Teraz zastanawiam się jak zamienić tabulatory na przecinek - by to tak rozpoznawał !

    0
  • Pomocny post
    #9 11 Cze 2010 23:33
    marcinj12
    Poziom 40  

    Nie radzę, ceny masz z przecinkiem, więc program będzie "głupiał". Już lepiej średnik. A sam znak definiujesz tutaj: fgetcsv($plik, 1000,"\t"), "\t" to tabulator, wpisz ";" to będzie średnik etc.

    0
  • #10 13 Cze 2014 15:39
    streacher
    Poziom 1  

    Pozwoliłem sobie odświeżyć temat.
    Chciałbym wykorzystać kod podany przez marcinj12 a nie za bardzo znam się na php jednak może ktoś mi podpowie co zamienić żeby wyszukiwarka odpowiednio działała.

    Mój table.csv zawiera następujące dane :

    Kod: php
    Zaloguj się, aby zobaczyć kod


    w tabela.php zamieniłem \t na ;

    w index.html pozostawiłem wybór jednej kategorii i nazwałem ją VIN ponieważ wyszukiwanie ma się odbywać na podstawie numeru VIN
    jednak teraz nie za bardzo wiem jak zamienić kod w tabela.php żeby wynik pokazywał status : np brak pojazdu lub w realizacji

    Prosiłbym o podpowiedź lub ewentualnie podanie innego pomysłu. Wyszukiwarka ma działać z poziomu strony on-line

    Z góry dziękuję za pomoc

    0