Dateizeiger

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

  • Dateizeiger

    Hi Folks,


    ich würde euch gerne mit einer Verständnissfrage beläßtigen.

    Das Einlesen einer großen Datei (5-20 GB) bereitet mir etwas Probleme.
    Die Struktur sieht so aus (FASTA-Format falls es jemandem bekannt ist):

    >header mit ein paar infos (unterschiedliche Längen)
    Daten_zu_diesem_header_Daten_zu_diesem_header
    Daten_zu_diesem_header_Daten_zu_diesem_header_Daten_zu_diesem_header
    Daten_zu_diesem_header
    Daten_zu_diesem_header_Daten_zu_diesem_header
    >header mit ein paar infos (unterschiedliche Längen)
    Daten_zu_diesem_header_Daten_zu_diesem_header
    Daten_zu_diesem_header_Daten_zu_diesem_header_Daten_zu_diesem_header
    Daten_zu_diesem_header
    Von ">" zu ">" ist immer ein Block, welcher zusammenhängend "ausgewertet" werden möchte ...
    (Jede Zeile kann eine andere Länge haben)

    Da natürlich bei dieser Größe das Einlesen in z.B. ein Array ja nicht in Frage kommt, muss Zeilenweise gelesen werden.

    Nach einigem Suchen musste ich jedoch leider feststellen, dass php keine Funktion bereitstellt um Zeilenweise den Zeiger zu setzten. Lediglich mit fseek kann jedes Zeichen der Datei "angesprochen" werden.

    So etwas wie "$file.next();" gibt es wohl in php nicht, oder? Also ein Zeilenweises navigieren durch z.B. große Dateien o.ä.

    Die momentan einzige vermeindlich "schöne" Lsg sehe ich nur darin, mir jede Zeigerposition des ersten Zeichens einer neuen Zeile geben zu lassen und wenn benötigt (immer wenn ein neuer Header kommt) so die Möglichkeit zu haben zur vorherigen Zeile zu springen.

    So war die eigentliche Idee:
    PHP-Code:
    while (gehe Zeilenweise durch die Datei) {

        if (
    wenn header) {
            
    speicher header temporär (tu noch was damit)
         } else {
            while (
    lies nun so lange bis neuer header) {
                   
    ebenfalls erst einmal tmp ablegen
             
    }
             
    so nun ganzer block nun bekannt -> tu was

             setze den zeiger um eine zeile zurück 
    (um wieder an den nächsten block zu kommen)
         }


    Ich hoffe mein Anliegen konnte ich einigermaßen darlegen.

    Hab ich nun eine pfiffige Funktion übersehen, oder muss ich diese etwas unschönen Weg über fseek machen?!

    Dankeschön schon mal!

    Gruß,
    Erdna

  • #2
    schonmal fgets() in betracht gezogen?

    Kommentar


    • #3
      Steht in diesen Headern die Länge bis zum nächsten Header, wie bei Tranfer-encoding: chunked?

      Kommentar


      • #4
        @krel

        Hmmmm ... ja auf fgets bin ich bei meiner Suche natürlich auch gestoßen, jedoch glaube ich das so verstanden zu haben, dass ich nur innerhalb einer Zeile (welche bei länge -1, eof oder line feed endet) springen kann, oder hab ich's missverstanden?!

        Ich würd ja gerne Zeilenweise im File "hoch oder runter" navigieren.


        @$_Baker

        Tja ich hab leider keine Ahnung wovon Du sprichst

        Vielleicht hab ich mich falsch ausgedrückt:
        Mit "Header" meine ich die Zeile welche mit ">" beginnt. Dieser beschreibt eigentlich nur die biologischen Daten welche im nachfolgenden Block stehen. Es ist kein klassischer Header mit z.B. Metainfos oder so.


        Vielleicht ein Beispiel

        ...
        >gi|16409891|emb|CAC98594.1|[16409891]
        cgataaaaaagatattagtaatttatttgcaattta
        tgctctcttttgtgtaaagcacatcaagcatgtagcaagcatgtagc
        cgataaaaaagatattagtaatttatttgcaatttaaac
        >gi|NP_28367354.3|Drosophila_melanogaster
        tgctctcttttgtgtaaagcacatcaagcatgtagc
        cgataaaaaagatattagtaatttatttgcaatttattt
        gcgatttttgtcaaagggacagcgatgggttacaag
        cgataaaaaagatattagtaatttatttgcaattta
        >Lmo_1-2a_EGD-e_a3(xyz)
        gcgatttttgtcaaagggacagcgatgggttacaa
        ...
        Gruß,
        Erdna

        Kommentar


        • #5
          warum willst du unbedingt hochspringen?
          Du schaust, ob das > am Anfang der Zeile steht, wenn ja, dann weißt du, das es ein "Header" ist.

          PS: Transfer-encoding: chunked bezeichnet eine http-response, die in mehrere Teile aufgeteilt ist, mit zeilen, in denen hexzahlen als längeangabe stehn

          Kommentar


          • #6
            Wenn ich versuche nach dieser Strategie die Datei durchzugehen, muss ich, wenn in der zweiten while schleife der Block Daten zu Ende ist und ein neuer "Header" kommt, den zeiger ja wieder auf diesen header setzten um ihn wieder in dem darüber befindlichen if zur verfügung zu haben!

            PHP-Code:
            while (gehe Zeilenweise durch die Datei) {

                if (
            wenn header) {
                    
            speicher header temporär (tu noch was damit)
                 } else {
                    while (
            lies nun so lange bis neuer header) { 
            Ich glaube ich poste später mal code + bsp. datei.
            Ich kanns irgendwie nicht wirklich schön erklären. Vielleicht stehe ich auch RICHTIG auf dem Schlauch.

            Kommentar


            • #7
              PHP-Code:
              $fp fopen($filename'r');
              if (
              $fp) {
                  while (!
              feof($fp)) {
                      
              $buffer fgets($fp4096);
                      if (
              $buffer[0] == '>') {
                          
              do_something_with($header$data);
                          
              $header $buffer;
                          
              $data '';
                      } else {
                          
              $data .= $buffer;
                      }
                  }
                  
              fclose($fp);

              Dieser Schnipsel braucht nur noch eine geeignete Initialisierung bzw. ein if($header) vor dem Aufruf der do_something-Funktion.

              Kommentar

              Lädt...
              X