einlesen von txt/csv files mit \n in texten

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

  • einlesen von txt/csv files mit \n in texten

    hiho.

    stehe vor einen mittleren bis mittelschweren problem .)

    also ich habe txt file ; getrennt.

    nun kommt es jedoch vor, das texte darin einen \n enthalten und sommit mit zeilenumbruch dargestellt werden.

    das führt natürlich zu fehlern im zeilenweisen einlesen durch meine funktion:

    PHP-Code:
    function stream_file()
    {

       
    $row 0;
       
    $dump = array();

       
    $f fopen ($this->dir.$this->filename,"r");
       
    $size filesize($this->dir.$this->filename)+1;
       while (
    $data fgetcsv($f$file_size$this->seperator)) {
           
    $dump[$row] = $data;
           
    $row++;
       }
       
    fclose ($f);

       return 
    $dump;


    jemand ne idee wie man das umgehen kann ? bzw eine idee wäre die exportfile mit ";" zu generieren, und solange zu streamen bis "\n auftritt ? (über mehrere zeilen)

    aber wie löst man dies ?

    mfg,
    mario

  • #2
    du musst BEVOR du die daten speicherst, die function nl2br() anwenden.

    das ersetzt dann alle neuen zeilen in deinem string mit <br />.


    danach hast du keine datensaetze mehr ueber mehrere zeilen.


    -----------

    DU WEISST, das du deine function auch einfacher haben kannst ?

    probier mal
    PHP-Code:
    $zeilen_array file('pfad/zu/deiner/datei.txt');
    //das ergibt dann ein array mit je einer zeile pro key.
    for($i=0;$i<count($zeilen_array);$i++)
    {
        
    //das ergibt dann ein array mit allen datensaetzen
        
    $datensatz_array[] = explode(';',trim($zeilen_array[$i]));

    Zuletzt geändert von lixlpixel; 09.05.2004, 20:24.
    geh zu lixlpixel phpsnippets.de fuer php code zum runterladen

    Kommentar


    • #3
      dein file sieht also so aus.


      baum; affe; haare
      see;fisch;
      schuppen
      luft;vogel;federn

      ???

      ist das ne einmalige Aktion?

      Kommentar


      • #4
        Original geschrieben von lixlpixel
        du musst BEVOR du die daten speicherst, die function nl2br() anwenden.
        das ersetzt dann alle neuen zeilen in deinem string mit <br />.
        danach hast du keine datensaetze mehr ueber mehrere zeilen.
        falsch.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          meine datei sieht zb so aus:
          (standard exportdatei von lexware)



          bei #7 ist zb solch ein \n in der datei enthalten.

          Artikelnummer;Text
          6;Lexware buchhalter pro vereint neben seiner Mehrplatzfähigkeit und der Modularität alle Tugenden in sich, die Sie von einem ausgereiften Buchhaltungsprogramm erwarten...
          7;Verwaltung von Angeboten, Lieferscheinen, Aufträgen und Rechnungen -mit praktischem Bestellwesen..


          weitere beschreibung
          8;Die optimale netz- und mehrplatzfähige Warenwirtschaft mit einfachster Bedienung und Profi-Funktionalität!..

          Kommentar


          • #6
            - lies die datei mit file() ein
            - füge den ziffern am anfang ein zusätzliches trennzeichen ein (zB |) => preg_replace()
            - mach ein explode auf das trennzeichen
            - in einer schleife noch ein ein explode auf die ; ... das wars
            Kissolino.com

            Kommentar


            • #7
              gute idee, aber nicht so einfach.

              wie erkenne ich denn obs eine ziffer in der ersten spalte ist, oder nur ein teil vom text ?

              jedoch kann das preg probleme bringen, bei files mit xx.xxx datensätzen, da dauert der import schon relativ lange ;(

              *edit, eine möglichkeit wäre die datensätze mit "," als trenner zu exportieren, dann wäre vor der zahl "8"; und am ende jeweils ein " nach dem text.

              aber wie könnte man das beim live streamen erkennen ?

              Zuletzt geändert von fanta2k; 09.05.2004, 23:43.

              Kommentar


              • #8
                Original geschrieben von wahsaga
                falsch.

                wenn ich einen string MIT einem \n drin in einer zeile in einem textfile speichern will, dann mache ich nl2br($string) und danach hab ich einen string mit <br /> statt \n .

                folglich kann ich danach das file mit file() auslesen ohne texte zu "zerreissen" ...

                was ist daran falsch ?
                geh zu lixlpixel phpsnippets.de fuer php code zum runterladen

                Kommentar


                • #9
                  @lixlpixel
                  nl2br -- Fügt vor allen Zeilenumbrüchen eines Strings HTML-Zeilenumbrüche ein.
                  http://de.php.net/manual/de/function.nl2br.php
                  @fanta2k
                  - jede zeile beginnt mit "ziffer/n + ;", das zu matchen, sollte kein thema sein
                  - wenns zu langsam wird, bearbeitest du die datei in 2 oder 3 durchläufen
                  - auch ein zusätzliches zeichen wird dich nicht vor einer regex schützen
                  Kissolino.com

                  Kommentar


                  • #10
                    Original geschrieben von lixlpixel
                    wenn ich einen string MIT einem \n drin in einer zeile in einem textfile speichern will, dann mache ich nl2br($string) und danach hab ich einen string mit <br /> statt \n .

                    folglich kann ich danach das file mit file() auslesen ohne texte zu "zerreissen" ...

                    was ist daran falsch ?
                    es ist dermassen falsch, weil du nicht lesen kannst.
                    1. wer sagt denn dass die Rohdaten von einer php-Website oder überhaupt von einer Website kommt?
                    2. das was du machst, ist genau das umgekehrte. nl2br wird nur bei der html-Ausgabe angewendet. Nicht mehr und nicht weniger.
                    3. um die Daten überall portieren zu können sollen die \n bzw. \n\r gefällig da bleiben wo sie sind. Sie zu irgendwas anderes zu ersetzen ist totaler Unfug. Was wäre wenn du sowohl ein echtes Warenwirtschaftsystem mit normale Programmfrontend und Webshop hast, die die gleiche DB als Backend sich bedient? Was soll denn das interne Frontend mit denn <br /> anfangen? Und wenn die gleiche Daten woanders auch gebraucht wird, was mit html nichts zu tun hat? \n ist der Standard und man soll deshalb nichts an dem Standard ändern, sondern mann passt die Daten für Ausnahmen entsprechend an. HTML-Ausgabe ist solch eine Ausnahme.

                    Kommentar


                    • #11
                      ist das wirklich die einzige möglichkeit ?

                      ne 10-20MB datei zu regexen und dann komplett in ein array zu sprengen um danach eine zeilenweise bearbeitung zu machen ist wohl bisserl viel,

                      die beste möglichkeit wäre ja wohl, zeile für zeile zu streamen und mit einer zeile aufhören sobald ein "\n" (angenommen ich verwende ";" beim export) auftritt aber keine ahnung wie ich das anstellen soll.

                      Kommentar


                      • #12
                        oder du liestzeilenweise ein, prüft, ob die eingelesene Zeile mit einer Zahl und ; anfängst, wenn ja, dann ist das, was bisher eingelesen ist, deine eigentliche Zeile, erst dann hier die komplette Zeile bearbeiten. Etwa so:

                        PHP-Code:
                        // 1.Zeile einlesen:
                        $work_line = ....
                        while (
                        $read_line=zeilenweiseEinlesen) {
                             if (
                        Zeile fängt mit Zahlan?) {
                                    { 
                                            
                        // work_line bearbeiten 
                                     
                        }
                                     
                        $work_line $read_line // erst nach Bearbeitung zuweisen
                              
                        } else $work_line .= $read_line// einfach zusammenfügen, da ein Datensatz

                        Kommentar


                        • #13
                          lösung

                          so, schlussendlich hats geklappt hier meine lösung.



                          PHP-Code:
                          function get_line_content($line,$file_content,$max_lines) {
                              
                          // get first line
                              
                          $line_data=array();
                              
                          $line_data['data']=$file_content[$line];
                              
                          $lc=1;
                              
                          // check if next line got ; in first 50 chars
                              
                          while (!strstr(substr($file_content[$line+$lc],0,50),';') && $line+$lc<=$max_lines) {
                                  
                          $line_data['data'] .=$file_content[$line+$lc];
                                  
                          $lc++;
                              }
                              
                          $line_data['skip']=$lc-1;
                              return 
                          $line_data;
                          }



                          // im script als call.

                                   
                          $line_fetch=$this->get_line_content($i,$inhalt,$lines);
                                   
                          $line_content=explode($this->seperator,$line_fetch['data']);
                                   
                          $i+=$line_fetch['skip']; 

                          Kommentar

                          Lädt...
                          X