Avatar billede old-faithful Praktikant
26. september 2006 - 21:41 Der er 12 kommentarer og
1 løsning

PHP-søgning i CSV-fil - Vol. 2

Hej.

Jeg har tidligere i http://www.eksperten.dk/spm/721268 søgt efter en måde at søge hurtigt i en kommasepareret fil (csv) og få vist resulaterne.

coderdk var så venlig at bidrage med en metode, som jeg langt om længe har fået til at køre. Problemet er dog at den ikke viser resultaterne når der er resultater men ellers viser de øvrige beskeder.

Koden kan ses herunder.

// Old-Faithful™
Avatar billede old-faithful Praktikant
26. september 2006 - 21:41 #1
--------------------- search.php ---------------------

<html>
<body>
<p>Search Page</p>
<hr>
<p>&nbsp;</p>

<!-- PHP CODE START -->

<script language="php">
    if (!empty( $_GET['srch'] ) )
    {
        // Kun når man har trykket submit
       
        // Her sættes nogle defaults
        $delim = (empty($_GET ['del']) ? ',' : $_GET ['del']);
        $str = (empty( $_GET ['str'] ) ? '"' : $_GET ['str']);
        $srch = (empty($_GET ['srch']) ? '' : $_GET ['srch']);
        if (empty($srch))
        {
            // Brugeren har ikke søgt efter noget
            die( 'Du skal søge efter noget.' );
        }
        $row = 0;
        if ( $handle = @fopen("din_fil.csv", "r" ))
        {
            // Her er filen åbnet
            while (($data = fgetcsv($handle, 1000, $delim, $str)) !== FALSE)
            {
                $fields = count($data); // Antal kolonner
                $found = false;
                for ($i = 0; $i < $fields; $i++)
                {
                    // I dette loop søger vi
                    if ($data[ $i ] == $srch)
                    {
                        // Et af felterne matcher!
                        $found = true;
                        break;
                    }
                }
                if ($found)
                {
                    // Kun hvis vi har fundet noget
                    $row++;
                    for ($c=0; $c < $num; $c++)
                    {
                        // Udskriv hele rækken
                        echo $data[$c] . "<br />\n";
                    }
                }
            }
            if ($row == 0)
            {
                echo "Ingen rækker fundet";
            }
        }
        else
        {
            echo "Kunne ikke åbne filen";
        }
    }
</script>
</body>
</html>
Avatar billede old-faithful Praktikant
26. september 2006 - 21:43 #2
Hov.. glemte lige at der selvfølgelig er en formular før PHP Code Start:

<form method="post" action="<?= $_SERVER['SCRIPT_NAME'] ?>">
    Adskiller: <input type="text" name="del" value=","><br>
    Strengadskiller: <input type="text" name="str" value="\""><br>
    Søg efter: <input type="text" name="srch">
    <input type="submit" value="Søg">
</form>
Avatar billede coderdk Praktikant
26. september 2006 - 23:22 #3
Dette virker for mig:

<html>
<body>
<p>Search Page</p>
<hr>
<p>&nbsp;</p>

<form method="post" action="<?= $_SERVER['SCRIPT_NAME'] ?>">
    Adskiller: <input type="text" name="del" value=","><br>
    Strengadskiller: <input type="text" name="str" value="\""><br>
    Søg efter: <input type="text" name="srch">
    <input type="submit" value="Søg">
</form>

<!-- PHP CODE START -->

<script language="php">
    if (!empty( $_POST['srch'] ) )
    {
        // Kun når man har trykket submit
     
        // Her sættes nogle defaults
        $delim = ( empty( $_POST ['del']) ? ',' : $_POST['del'] );
        $str = ( empty( $_POST['str'] ) ? '"' : $_POST['str'] );
        $srch = ( empty( $_POST['srch']) ? '' : $_POST['srch'] );
        if (empty($srch))
        {
            // Brugeren har ikke søgt efter noget
            die( 'Du skal søge efter noget.' );
        }
        $row = 0;
        if ( $handle = fopen("din_csv.csv", "r" ))
        {
            // Her er filen åbnet
            $n = 0;
            while (($data = fgetcsv($handle, 1000, $delim, $str)) !== FALSE)
            {
                $n++;
                $fields = count($data); // Antal kolonner
                $found = false;
                for ($i = 0; $i < $fields; $i++)
                {
                    // I dette loop søger vi
                    if ( preg_match( "/" . preg_quote( $srch, "/" ) . "/i", $data[$i] ) )
                    {
                        // Et af felterne matcher!
                        $found = true;
                        break;
                    }
                }
                if ($found)
                {
                    // Kun hvis vi har fundet noget
                    $row++;
                    echo "Match $row række $n: ";
                    echo implode( "$delim ", $data );
                    echo "<br>\n";
                }
            }
            if ($row == 0)
            {
                echo "Ingen rækker fundet";
            }
        }
        else
        {
            echo "Kunne ikke åbne filen";
        }
    }
</script>
</body>
</html>
Avatar billede old-faithful Praktikant
27. september 2006 - 00:34 #4
Nu virker det! Takker!

Jeg har forresten lige et par spørgsmål:
1. Hvad bruges strengadskilleren til?
2. Er der nogen måde hvorpå jeg i resultaterne f.eks. kan vise kun én bestemt kolonne fra resultaterne?
Avatar billede coderdk Praktikant
27. september 2006 - 09:03 #5
Så lidt :)

1. Strenge er normalt genkendt ved at de starter og slutter med " - That's it :)
2. Ja:

                    echo "Match $row række $n: ";
                    echo implode( "$delim ", $data );
                    echo "<br>\n";

Kan laves om til f.eks:

                    echo "Match $row række $n kolonne $i: ";
                    echo $data[$i];
                    echo "<br>\n";
Avatar billede old-faithful Praktikant
27. september 2006 - 12:04 #6
Udmærket.. her er dine point.
Avatar billede old-faithful Praktikant
23. januar 2007 - 21:53 #7
Hej igen.

Jeg har opdaget to små problemer med scriptet:
  1. Søger jeg efter ord med dansk bogstaver (æ, ø, å) bliver søgning pludselig "case-sensitive"
  2. Hvis det første bogstav i ordlisten er et dansk bogstav, vises det første bogstav ikke i søgeresultatet.

Er der nogen simpel løsning på disse to problemer? Hvis løsningen ikke er ligetil, kan jeg godt oprette et nyt spørgsmål om emnet.
Avatar billede coderdk Praktikant
23. januar 2007 - 22:50 #8
Du kan prøve i starten af scriptet at sætte:

setlocale( LC_ALL, "da", "da_DK", "dan", "danish", "da_DK.ISO88591" );
Avatar billede old-faithful Praktikant
23. januar 2007 - 22:54 #9
Jamen det er jo smukt! Nu virker det perfekt! Ønsker du point og i givet fald hvor mange?
Avatar billede coderdk Praktikant
23. januar 2007 - 22:57 #10
Næh, nej, det var service :)
Avatar billede old-faithful Praktikant
23. januar 2007 - 23:04 #11
Så får du noget god karma i stedet for ;-)
Avatar billede windcape Praktikant
23. januar 2007 - 23:08 #12
a) load CSV ind i et array
b) brug array_search eller en form for array_*_search
c) færdig

meget mere simpelt :p
Avatar billede old-faithful Praktikant
23. januar 2007 - 23:24 #13
Windcape>Tak for forslaget, men det er egt. et gammelt spørgsmål, og coderdk's løsning virker fint.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester