preg_replace bei csv-datei-import

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • preg_replace bei csv-datei-import

    ich habe ein problem beim einlesen einer csv-datei. das zeilenweise einlesen klappt soweit ganz gut, jedoch: wenn der inhalt einer Spalte mit Anführungsstrichen geschachtelt ist, bekomme ich schwierigkeiten beim "exploden" der einzelnen Spalten. hier nun der relevante Auszug aus dem Skript:


    PHP-Code:
    $AA = explode("\r\n", $page);
            $zeilen_anzahl=count($AA);
            echo $zeilen_anzahl.'Zeilen<br>';
            
            #echo "<textarea name=\"textarea\" rows=30 cols=30>".$page."</textarea><br>";
            #preg_replace("/\\\"(.*)\\\"/", "$1", $csv);
            #preg_replace('/\\"([^(\")\r\n]*)\\"/','$1',$csv);
            #echo "<textarea name=\"textarea\" rows=30 cols=30>$page</textarea>";
            
            $erste_zeile_spalten= $AA[0];
            $spalten_namen=explode(";",$erste_zeile_spalten);
            $spalten_in_datei=count($spalten_namen);
            ?><table border="1" bordercolor="#EFEFEF" cellpadding="1" cellspacing="1" width="1000">
            <?php 
            
    function changetext($txt) {
                    
    $txt str_replace(";\"""ßßßßß"$txt);
                    
    $txt str_replace("\";""ßßßßß"$txt);
                    
    $txt str_replace(";"", "$txt);
                    
    $txt str_replace("\"""."$txt);
                    
    $txt str_replace("ßßßßß"";"$txt);
                    
    #$txt = htmlentities($txt);
                    
    return $txt;
                    }
            
    #for($i=0;$i<$zeilen_anzahl;$i++)
            
    for($i=0;$i<40;$i++)
                {
                
                
    #if(preg_match('[;]',$AA[$i]){?>
                <tr><td colspan=7> <?php echo htmlentities(str_replace("#",'',$AA[$i]));?></td></tr>
                <?php 
                
    #} ?>
                <tr valign="top"><td><?php echo $i?></td>
                <?php 
                
    for($j=0;$j<$spalten_in_datei;$j++)
                    {
                    
    #^[a-z0-9\._-]+@+[a-z0-9\._-]+\.+[a-z]{2,4}$
                    #$AA[$i] = preg_replace('!;(.*?);!',"§§§$1§§§",$AA[$i]);
                    #$AA[$i] = preg_replace("^(\";)(.*?)(;\")$","§§§$1§§§",$AA[$i]);
                    #$AA[$i] = preg_replace("(\";)(.*?)(;\")","§§§$1§§§",$AA[$i]);
                    /*
                    
                    $text = preg_replace("/(\[change])(.*)(\[\/change\])/eisU", "changetext('$2')", $text);
                    */
                    #$AA[$i] = preg_replace("(/^a/i)(.*?)(/^a/i)","§§§$1§§§",$AA[$i]);
                    #$AA[$i] = preg_replace("/(;\")(.*)(\";)/eisU", "changetext('$2')", $AA[$i]);
                    
    $AA[$i] = preg_replace("/(;\")(.*)(\";)/eiU""changetext('$2')"$AA[$i]);
                    
    $spalte_inhalt=explode(";",$AA[$i]);
                    
    ?>
                    <td><?php $inhaltsausgabestr_replace("#",'',$spalte_inhalt[$j]);
                    if(
    $inhaltsausgabe!=""){echo $inhaltsausgabe;}else{echo"-";}
                    
    ?></td>
                    <?php
                    
    }
                    
    ?>
                </tr>
                <?php 
                
    }
    Wer kann mir da weiterhelfen?

  • #2
    http://www.php-resource.de/forum/sho...threadid=50454
    danke

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      OK habs beherzigt, gelobe Besserung, aber wie komm ich jetzt bei dem Problem mit der CSV weiter?

      Kommentar


      • #4
        Ich hab mir deine Fehlerbeschreibung jetzt 3 mal durchgelesen und ich hab kein Wort verstanden wo dein Problem liegt. Ich hab mir vorgestern erst ein CSV Import programmiert und hatte keinerlei Schwierigkeiten.
        a.) Wie liest du die Datei ein? Verwendest du die Funktion fgetcsv
        b.) Beschreibe doch bitte mal dein Problem etwas verständlicher.

        Danke

        Kommentar


        • #5
          also das problem beschränkt sich im grunde genommen darauf, daß ich alle Semikolons zwischen zwei Anführungszeichen in irgend ein anderes Zeichen wandeln muß und die Anführungszeichen anschließend (oder gleichzeitig?) entfernen möchte, da die übrigbleibenden Semikolons als Trennzeichen für die einzelnen Spalten dienen. Dafür brauchte ich einen funktionierenden Regulären Ausdruck. Habe mich schon den gestrigen Tag damit rumgequält, bekomme es aber irgendwie nicht hin. hier ist mal eine Beispielszeile aus der CSV:

          12197;Adobe, Acrobat 7.0 Standard, Vollversion, UK,;500,90;22001944;"7.0 englisch/ Vollversion/ Format: Box/ Datenträger: CD/ System: Microsoftr Windowsr 2000 mit Service Pack 2, Windows XP Professional oder Home, Windows XP Tablet PC Edition; 7.0; WIN; E; CD Adobe 22001944";Grafik / DTP / WEB

          jetzt trennt er bei den Anführungszeichen halt nicht richtig und sieht die semikolons innerhalb der anführungszeichen als Trennsymbol an.
          Zuletzt geändert von kleenebub; 25.04.2006, 10:16.

          Kommentar


          • #6
            Ok - aber wofür, das versteh ich nicht. Hast du dir mal die Funktion fgetcsv angeschaut?
            EDIT:
            Ahhh so langsam komme ich hinter dein Problem - ich vermute, dass einer deiner Datensätze wie folgt aussehen könnte:
            Code:
            ID; Text; Irgendein Feld
            1; ballablalblalballblal[B][COLOR=red]";"[/COLOR][/B] blabmöasök; Irgendein Text
            Jetzt ist das markierte Semikolon der Störfaktor, richtig? Wenn das der Fall ist, dann ist deine CSV-Datei leider Gottes falsch aufgebaut. Normalerweise sollte ein Trennzeichen nicht noch als normaler Text in einem Datensatz vorkommen.

            Zuletzt geändert von reallife; 25.04.2006, 10:20.

            Kommentar


            • #7
              die datei wird mit fsockopen() eingelesen und liegt in einer variable vor. diese wird dann zeilenweise verarbeitet. soweit klappt das auch schon. Mit explode() werden dann die einzelnen spalten separiert, aber das explode merkt halt nicht so richtig, daß es die semikolons zwischen den anführungsstrichen nicht behandeln darf :-(

              12197;Adobe, Acrobat 7.0 Standard, Vollversion, UK,;500,90;22001944;"7.0 englisch/ Vollversion/ Format: Box/ Datenträger: CD/ System: Microsoftr Windowsr 2000 mit Service Pack 2, Windows XP Professional oder Home, Windows XP Tablet PC Edition; 7.0; WIN; E; CD Adobe 22001944";Grafik / DTP / WEB

              die csv-datei lese ich von einem entfernten server ein und habe keinen einfluß auf deren Erstellung
              Zuletzt geändert von kleenebub; 25.04.2006, 10:23.

              Kommentar


              • #8
                www.php.net/fgetcsv !!! zum fünften mal. reallife hat dir doch schon gesagt, wie du arbeiten sollst.

                Kommentar


                • #9
                  Original geschrieben von axo
                  www.php.net/fgetcsv !!! zum fünften mal. reallife hat dir doch schon gesagt, wie du arbeiten sollst.
                  bringt hier nix, da das trennzeichen im content vorkommt...

                  Kommentar


                  • #10
                    Beherzige er doch bitte den Vorschlag von axo der auch von mir schon vorgeschlagen wurde. Die Funktion erledigt deine Probleme - hab ich eben noch mal getestet. ;-)
                    CSV Datei hab ich mit deinem Beispieldatensatz befüllt.
                    Code:
                    $f = fopen("test.csv", "r");
                    while ( $data = fgetcsv($f, 65535, ";") )
                    {
                    	print_r($data);
                    }
                    Resultat:
                    Code:
                    Array
                    (
                        [0] => 12197
                        [1] => Adobe, Acrobat 7.0 Standard, Vollversion, UK,
                        [2] => 500,90
                        [3] => 22001944
                        [4] => 7.0 englisch/ Vollversion/ Format: Box/ Datenträger: CD/ 
                    System: Microsoftr Windowsr 2000 mit Service Pack 2, Windows XP Professional oder Home, 
                    Windows XP Tablet PC Edition; 7.0; 
                    WIN; E; CD Adobe 22001944
                        [5] => Grafik / DTP / WEB
                    )
                    Zuletzt geändert von reallife; 25.04.2006, 10:42.

                    Kommentar


                    • #11
                      Original geschrieben von Bushmasta
                      bringt hier nix, da das trennzeichen im content vorkommt...
                      Behauptest du..

                      Kommentar


                      • #12
                        Original geschrieben von Bushmasta
                        bringt hier nix, da das trennzeichen im content vorkommt...
                        elftes gebot: du sollst nicht klugscheißen.

                        Kommentar


                        • #13
                          OffTopic:
                          Ich glaub es ist an der Zeit den Thread zu schließen

                          Kommentar


                          • #14
                            Original geschrieben von reallife
                            OffTopic:
                            Ich glaub es ist an der Zeit den Thread zu schließen
                            ack.

                            Kommentar

                            Lädt...
                            X