Dateiinhalt nach Spalten sortieren

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

  • Dateiinhalt nach Spalten sortieren

    Hallo,
    Ich möchte eine Datei in ein Array einlesen und dann den Inhalt nach den Spalten
    sortieren.
    In dem Beispiel geht das nur mit dem fertigen Array $arr='aaa|ccc|bbb|zzz|eee';
    Es soll aber mit dem Inhalt der Datei gehen!

    Kann mir jemand bissl auf die Sprünge helfen, ich habe immer ärger mit arrays,
    entweder die verstehen mich nicht oder ich sie nicht :-)

    Danke erstmal


    PHP-Code:
    /* Dateiinhalt
    4|beta1|zulu2|166|1453
    3|alpha1|charly2|50|1230
    1|charly1|alpha2|50|1230
    2|zulu1|beta2|118|1455
    */

    #$datei="datei.txt"; $arr=file($datei); # Damit gehts nicht
    $arr='aaa|ccc|bbb|zzz|eee'# Mit diesem vordefinierten Array geht es

    $zt=explode('|',$arr);

    echo 
    "Unsortiert<br />";
    for(
    $i=0$i<=count($zt); $i++) {echo $zt[$i].'<br />';}


    array_multisort($ztSORT_ASC);
    echo 
    "<hr />ASC sortiert<br />";
    for(
    $i=0$i<=count($zt); $i++) {echo $zt[$i].'<br />';}


    array_multisort($ztSORT_DESC);
    echo 
    "<hr />DESC sortiert<br />";
    for(
    $i=0$i<=count($zt); $i++) {echo $zt[$i].'<br />';} 
    ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

  • #2
    Re: Dateiinhalt nach Spalten sortieren

    Original geschrieben von RamonaS
    PHP-Code:
    #$datei="datei.txt"; $arr=file($datei); # Damit gehts nicht
    $arr='aaa|ccc|bbb|zzz|eee'# Mit diesem vordefinierten Array geht es 
    Schön - dann ist ja wohl das allererste, was du jetzt mal machst, dir diese beiden Arrays anzuschauen, und sie zu vergleichen - wo liegen die Unterschiede?

    Dann überlegst du dir, wie man das eine Array ggf. so umformen könnte, dass es dem Aufbau des anderen entspricht.
    Oder, wie man das Sortieren sonst vielleicht machen könnte.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Nun ja, der Unterschied ist wohl das in dem fertigen, vordefinierten array die sortierung pro zeile statfindet und ich möchte ja die sortierung pro spalte durchführen.

      Mußte ich jetzt den Inhalt von $arr
      $datei="datei.txt"; $arr=file($datei);

      hier umsortieren von vertical in horizontal?

      Also ich hab keine Plan, nicht mal einen Notfallplan
      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

      Kommentar


      • #4
        hab mal heute meinen gutmütigen:
        PHP-Code:
        $data file_get_contents('datei.txt');
        $arr explode ("\r\n"$data);
        sort ($arr);

        for (
        $i 0$i count($arr); $i++)
        {
          
        $line explode('|',$arr[$i]);
          
        $content = array($line[1],$line[2],$line[3], $line[4]);
          
        sort ($content);
          
        print_r($content);

        mal auf die schnelle und ungetestet.

        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Ok ich bin mal wieder festgefahren...soweit sieht das script ja gut aus, auch die sache mit den GET variablen funktioniert, aber die sortierung klappt nicht

          Es soll beim klicken der jeweiligen spalte, diese jeweils nach ASC oder DESC sortiert werden.


          PHP-Code:
          /* Dateiinhalt
          4|beta1  |zulu2  |166 |118
          3|alpha1 |charly2|050 |20
          1|charly1|alpha2 |20  |166
          2|zulu1  |beta2  |118 |0050
          */

          $d1=file_get_contents('datei.txt'); $arr=explode("\r\n",trim($d1)); $all=count($arr); #sort($arr);

          if(!isset($_GET['so'])){$sp=0$so="ASC";}
          else{
          $sp=$_GET['sp']; $so=$_GET['so'];}
          $so=($so=="ASC")?"DESC":"ASC"# Sortierung ändern, in die andere Richtung

          echo "\n<table border=1 width=300>\n";
          echo 
          "  <tr><td><a href='?sp=0&so=$so''>SP0</a></td><td><a href='?sp=1&so=$so''>SP1</a></td><td><a href='?sp=2&so=$so''>SP2</a></td>";
          echo 
          "   <td><a href='?sp=3&so=$so''>SP3</a></td><td><a href='?sp=4&so=$so''>SP4</a></td></tr>\n";
          echo 
          "  <tr><td colspan='5'>Sortiert nach Spalte: ".$_GET['sp'].", Order: ".$so."</td></tr>\n";
          for(
          $i=0;$i<$all;++$i)
           {
          $spalte=explode('|',$arr[$i]);
            
          $content=array($spalte[0],$spalte[1],$spalte[2],$spalte[3],$spalte[4]);
            
          #sort($content); echo "<pre>"; print_r($content); echo "</pre>";

            
          if($sp==0) {array_multisort($spalteSORT_ASC);} # array_multisort($spalte, SORT_DESC);
            
          if($sp==1) {array_multisort($spalteSORT_ASC);}
            if(
          $sp==2) {array_multisort($spalteSORT_ASC);}
            if(
          $sp==3) {array_multisort($spalteSORT_ASC);}
            if(
          $sp==4) {array_multisort($spalteSORT_ASC);}

            echo 
          "  <tr><td>".$spalte[0]."</td><td>".$spalte[1]."</td><td>".$spalte[2]."</td><td>".$spalte[3]."</td><td>".$spalte[4]."</td></tr>\n";
           }
          echo 
          "</table>\n"
          ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

          Kommentar


          • #6
            Versuchs mal mit EVA: Erst die Daten in ein Array lesen, das Array sortieren, das sortierte Array ausgeben.

            Kommentar


            • #7
              Mahlzeit!

              Wenn ich höre: "nach Spalten sortieren", denke ich meistens zuerst an eine Datenbanktabelle und seltener an PHP-Arrays, weil die keine Spalten haben.
              Und ehe ich mich mit dem komischen array_multisort() herumschlage oder versuche deinen "festgefahrenen" Quelltext zu debuggen ...

              PHP-Code:
              //* Dateiinhalt nach Spalten sortieren

              // Vorarbeit
              // Wir basteln uns sowas Aehnliches wie eine CSV-Datei
              $test_data '4|beta1|zulu2|166|1453
              3|alpha1|charly2|50|1230
              1|charly1|alpha2|50|1230
              2|zulu1|beta2|118|1455'
              ;

              // aus der Datei lesen wir das ganze Elend dann wieder ein
              $file 'f:/php-res-2009-04-07';
              // aber erstmal muessen die Testdaten da rein
              file_put_contents($file$test_data);


              // Ab hier beginnt die eigentliche Problemloesung
              // Datei zum Lesen oeffnen
              $fh fopen($file'r');
              if (!
              is_resource($fh)) {
                die(
              'Konnte datei nicht zum Lesen öffnen!');
              }

              // unsere Datenbanktabelle braucht einen Namen
              $table sqlite_escape_string('meinetabelle');

              $dbc sqlite_open("$file.sqlite"0666$sqlite_open_error);
              if (!
              is_resource($dbc)) {
                
              fclose($fh);
                die(
                    
              'Konnte keine Verbindung zur Datenbank herstellen! Fehler: ' .
                    
              $sqlite_open_error
                
              );
              }

              // (eventuell vorhandene) Tabelle löschen
              // sonst gibt es Durcheinander
              $res = @sqlite_query($dbc"drop table $table");

              // Text zeilenweise einlesen
              // $line: Textzeile aus Datei
              // $row: Tabellenzeile (Datensatz) in der Datenbank
              for ($caption NULLFALSE !== $line fgets($fh); ) {
                
              // Leerzeilen ueberspringen
                
              if (preg_match('/\A\s*\z/'$line)) {
                  continue;
                }
                
                
              // Textzeile bereinigen und aufspalten
                
              $row explode('|'trim($line));

                if (
              NULL === $caption) {
                  
              // Spaltennamen automa(g|t)isch erstellen
                  // die braucht die Datenbank u. A. fürs Sortieren
                  // die Spalten bekommen Namen wie "col0", "col1" usw.
                  
              $caption preg_replace('/\A./''col$0'array_keys($row));

                  
              // daraus eine Spaltenueberschrift basteln
                  
              $caption '(' implode(', '$caption) . ')';

                  
              // Tabelle erzeugen
                  
              $query "create table $table $caption";;
                  
              $res sqlite_query($dbc$query);
                  if (!
              is_resource($res)) {
                    die(
              'Konnte Datenbanktabelle nicht erstellen');
                  }
                }

                
              // (eventuell vorhandene) unsichere Zeichen im Datensatz maskieren
                
              $row array_map('sqlite_escape_string'$row);
                
              // Zeile in Tabelle schreiben
                
              $query "insert into $table $caption values ('" implode("', '"$row) . "')";
                
              $res sqlite_query($dbc$query);
                if (!
              is_resource($res)) {
                  
              // Fehler beim In-Tabelle-Schreiben
                  // wahrscheinlich falsche Anzahl der Einträge in dieser Zeile
                  
              continue;
                }
              }

              // die Datei brauchen wir jetzt nicht mehr
              fclose($fh);

              /******************************************************************************/
              // Sortierkriterien einstellen:
              // Spaltennamen in gewuenschter Reihenfolge kommasepariert angeben
              $order_by ''// Ergebnis unsortiert lassen
              $order_by 'order by col0, col1'// nur ein Beispiel
              $order_by 'order by col4 DESC, col0 ASC'// noch ein Beispiel
                                                          // you get the idea?
              /******************************************************************************/

              // Tabelle (sortiert) auslesen
              $query "select * from $table $order_by";
              $res sqlite_query($dbc$query);
              if (!
              is_resource($res)) {
                die(
              'Fehler beim Sortieren: ' sqlite_error_string(sqlite_last_error($dbc)));
              }

              // Ziel-Array:
              $dst_array = array ();
              for (
              $mode SQLITE_ASSOCFALSE !== $row sqlite_fetch_array($res$mode); ) {
                
              // beim Auslesen der ersten Tabellenzeile Spaltennamen holen
                
              if (SQLITE_ASSOC === $mode) {
                  
              $caption array_keys($row); // Ueberschrift
                  
              $row array_values($row); // Datensatz
                  
              $mode SQLITE_NUM;
                }
                
              // Tabellenzeile in Ziel-Array schreiben
                
              $dst_array[] = $row;
              }

              // datenbankverbindung schlieszen
              sqlite_close($dbc);

              // Ueberschrift (Spaltennamen) anzeigen:
              print_r($caption);
              // Ziel-Array anzeigen
              print_r($dst_array); 
              Der Zaubertrick passiert beim Kommentar "Suchkriterien einstellen".

              Es soll beim klicken der jeweiligen spalte, diese jeweils nach ASC oder DESC sortiert werden.
              Die Ausgabe in putzig formatierten HTML-Tabellen und das Einbauen des Ganzen in ein Webformular überlasse ich dir als Übungsaufgabe. Irgendetwas musst du ja auch mal selbst machen.
              Zuletzt geändert von fireweasel; 07.04.2009, 11:32.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar


              • #8
                @fireweasel

                Halleluja das ist mal wieder ein killercode für mich

                Ähmm ich wollte aber keine datenbank, das soll lediglich mit reiner textdatei passieren.

                Wenn wir schon dabei sind....
                ich sehe da eine menge "sqlite" ist das eine abgespeckte mysql version?
                Ich kenne nur MySQL und MSSQL (vom hören sagen)....mein provider hat kein sqlite am laufen, würde dann dein script auf meiner domain garnicht laufen?
                ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                Kommentar


                • #9
                  Hi,

                  Original geschrieben von RamonaS
                  @fireweasel

                  Halleluja das ist mal wieder ein killercode für mich
                  fragt sich nur, was das "killt"...

                  Ein mehrdimensionales Array kannst Du mit usort() sortieren. Und da Dein Kriterium vom GET-Parameter abhängt, musst Du die Callback-Funktion dafür dynamisch zur Laufzeit erstellen. Einfaches Beispiel:

                  PHP-Code:
                  usort($arrcreate_function('$a,$b''$a_arr = explode("|", $a); $b_arr = explode("|", $b); return $a_arr[' $sp '] < $b_arr[' $sp '];')); 
                  Musst Du noch für Deine Zwecke anpassen (Vergleich, Sortierreihenfolge).

                  LG

                  Kommentar


                  • #10
                    Original geschrieben von RamonaS
                    @fireweasel

                    Halleluja das ist mal wieder ein killercode für mich
                    Naja, es wäre einfacher gewesen (und übersichtlicher geworden), wenn ich eine vernünftigere Datenbankschnittstelle benutzt hätte -- sprich eine komfortablere DB-Abstraktionsklasse.

                    Ähmm ich wollte aber keine datenbank, das soll lediglich mit reiner textdatei passieren.
                    Deswegen hab ich ja auch SQLite und nicht mySQL oder einen anderen dicken Brocken benutzt. Es ist sogar möglich, die Datenbank direkt im Hauptspeicher zu erstellen, dann wird auch keine temporäre Datei nötig. Geschwindigkeitstest hab ich allerdings keine gemacht -- schließlich werde ich ja auch nicht dafür bezahlt.

                    Und SQLite ist eine serverlose Datenbank-Engine. Geschwindigkeit ist in etwas so groß wie beim direkten Lesen aus oder Schreiben in Dateien. Legt man die Datenbank im Hauptspeicher ab, gehts noch schneller.

                    Wenn wir schon dabei sind....
                    ich sehe da eine menge "sqlite" ist das eine abgespeckte mysql version?
                    Ich hab mir sagen lassen, dass es auch auf'm C64 lauffähige Webbrowser gibt.
                    Klickst du:
                    http://de.wikipedia.org/wiki/SQLite
                    http://sqlite.org/

                    Ich kenne nur MySQL und MSSQL (vom hören sagen)....mein provider hat kein sqlite am laufen, würde dann dein script auf meiner domain garnicht laufen?
                    Sollte dein Provider kein "SQLite am laufen" haben, dann betreibt er seine Server aber wahrscheinlich auch noch per Dampfmaschine. Seit PHP5 ist SQLite (mit der von mir verwendeten Schnittstelle) serienmäßig dabei. PHP-Version 4 kann man nun wirklich nicht mehr empfehlen, aber auch da lässt sich die Erweiterung nachinstallieren.
                    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                    Kommentar


                    • #11
                      @fireweasel

                      So jetzt möchte ich das sqlite zum laufen bringen.

                      Ich habe mir die exe + dll von dem link den du gepostet hast runtergeladen.....hab aber festgestellt das in meinem xampp alles schon integriert ist.

                      Ok ich hab jetzt das beispielscript von dir aufgerufen und erhalte die fehlermeldung "Konnte Datenbank nicht erstellen".

                      Ich hab mit sqlite noch nie gearbeitet. Wo wird den diese datenbank erstellt, unter mysql wird die datenbank in dem ordner mysql/data erstellt, wo macht sqlite das? und warum kommt jetzt diese fehlermeldung?

                      danke erstmal
                      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                      Kommentar


                      • #12
                        Yeaah, prima! Jetzt darf ich auch noch Support leisten!
                        Das wird aber teuer!

                        Original geschrieben von RamonaS
                        So jetzt möchte ich das sqlite zum laufen bringen.

                        Ich habe mir die exe + dll von dem link den du gepostet hast runtergeladen.....hab aber festgestellt das in meinem xampp alles schon integriert ist.
                        Sag ich doch. Bei einem aktuellen XAMPP-Paket sollte das dabei sein.

                        Ok ich hab jetzt das beispielscript von dir aufgerufen und erhalte die fehlermeldung "Konnte Datenbank nicht erstellen".
                        Du Schelm, die Fehlermeldung kann ich in meinem Quälcode gar nicht finden.

                        Ich tippe daher mal auf "Konnte keine Verbindung zur Datenbank herstellen! Fehler: ..." -- und warte gespannt auf die Dokumentation der restlichen Meldung deinerseits.

                        Andererseits können wir auch die Datenbank (wie ich oben schon erwähnte) komplett ins RAM verlegen -- da gibts keine Pfade und Rechte zu beachten.

                        Hier der Teil, der dazu geändert werden müsste:

                        PHP-Code:
                        // ...
                        // unsere Datenbanktabelle braucht einen Namen
                        $table sqlite_escape_string('meinetabelle');

                        $dbc sqlite_open(':memory:'0666$sqlite_open_error);
                        if (!
                        is_resource($dbc)) {
                          
                        fclose($fh);
                          die(
                              
                        'Konnte keine Verbindung zur Datenbank herstellen! Fehler: ' .
                              
                        $sqlite_open_error
                          
                        );
                        }

                        // Text zeilenweise einlesen
                        // ... 
                        Das Löschen der Tabelle entfällt, weil eine RAM-Datenbank nach sqlite_open() leer ist.

                        Ich hab mit sqlite noch nie gearbeitet. Wo wird den diese datenbank erstellt, unter mysql wird die datenbank in dem ordner mysql/data erstellt, wo macht sqlite das?
                        Die Datenbank wird in dem Pfad erstellst, den du bei sqlite_open() angibst. Die angebebene Datei und auch das Verzeichnis, in dem sie liegt, müssen (in unserem Fall) lesbar und beschreibbar sein.

                        Ich hatte einfach den Pfad zu deiner einzulesenden Datei genommen und ans Ende ".sqlite" angehängt. Du kannst dir das entsprechende Argument vorsichtshalber ausgeben lassen, bevor du es sqlite_open() übergibst.

                        und warum kommt jetzt diese fehlermeldung?
                        Das sage ich dir (vielleicht), wenn du die richtige und komplette Fehlermeldung postest.
                        Zuletzt geändert von fireweasel; 10.04.2009, 22:43.
                        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                        Kommentar


                        • #13
                          Oh ja, hab das flasch gelesen, also hier die fehlermeldung:

                          Warning: sqlite_query() [function.sqlite-query]: near "0": syntax error in C:\xampplite\htdocs\sqlite.php on line 63
                          Konnte Datenbanktabelle nicht erstellen

                          Also in dieser zeile:
                          if(!is_resource($res)) {die('Konnte Datenbanktabelle nicht erstellen');}
                          ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                          Kommentar


                          • #14
                            Original geschrieben von RamonaS
                            Oh ja, hab das flasch gelesen, also hier die fehlermeldung:

                            Warning: sqlite_query() [function.sqlite-query]: near "0": syntax error in C:\xampplite\htdocs\sqlite.php on line 63
                            Konnte Datenbanktabelle nicht erstellen

                            Also in dieser zeile:
                            if(!is_resource($res)) {die('Konnte Datenbanktabelle nicht erstellen');}
                            Huch! Den Fehler gab's bei mir nicht ...

                            In dem Fall wäre es nützlich zu wissen, welchen Wert $dbc und $query vor dem Aufruf von
                            PHP-Code:
                            $res sqlite_query($dbc$query); 
                            hatten.
                            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                            Kommentar


                            • #15
                              Ok ich habe dahinter jeweils ein echo und das steht dort in echo drin:

                              $dbc=sqlite_open("$file.sqlite",0666,$sqlite_open_error);

                              echo $dbc;
                              Resource id #5


                              # Tabelle erzeugen
                              $query="create table $table $caption";

                              echo $query;
                              create table meinetabelle (0, 1, 2, 3, 4)

                              Nur zur Info: es wird im gleichen ordner eine textdatei erstellt mit dem
                              Inhalt aus $test_data
                              Und es wird eine 2te Datei erstelt, die hat den gleichen dateiname, nur
                              das dahinter noch .sqlite steht....diese datei ist aber leer!
                              ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                              Kommentar

                              Lädt...
                              X