Dateiinhalt umsortieren

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

  • Dateiinhalt umsortieren

    PHP-Code:
    Ich habe eine riesige Dateietwa 120000 zeilen die diesen aufbau hat:

    breite x höhe  farbtiefe
    1024 x 768
    ]-[32
    1024 x 768
    ]-[32
    1152 x 864
    ]-[32
    1152 x 864
    ]-[32
    1152 x 864
    ]-[32
     800 x 600
    ]-[24
    1024 x 768
    ]-[24
    1024 x 768
    ]-[32
    1280 x 1024
    ]-[24
     800 x 600
    ]-[16
    1024 x 768
    ]-[24
    1024 x 768
    ]-[32
    1280 x 1024
    ]-[16


    Diesen inhalt möchte ich umsortieren
    so das der inhalt danach so aussieht:

    anzahl breite x höhe  farbtiefe
    004
    ]-[1024 x 768]-[32
    002
    ]-[1024 x 768]-[24
    002
    ]-[1152 x 864]-[32
    001
    ]-[800 x 600]-[24
    001
    ]-[800 x 600]-[16
    001
    ]-[1280 x 1024]-[24
    001
    ]-[1280 x 1024]-[16



    Es soll 
    die anzahl der doppelten auflösungen gezählt werden und
    der unterschied der farbtiefe mit berücksichtigt werden
    .

    Was ich bisher hinbekommen habees werden die doppelten auflösungen
    ermittelt
    aber nicht die farbtiefeda steht nur der wert 32 drin

    $datei1="scr.txt"$arr1=file($datei1);
    $datei2="scr_neu.txt"$arr2=file($datei2);

    for(
    $i=0$i<count($arr1); ++$i)
     {
    $zt=explode("]-["trim($arr1[$i]));
      
    $swh[] = $zt[0];
      
    $sbit[] = $zt[1];
     }

    $diff=array_count_values($swh); arsort($diff);

    $i=0;
    foreach(
    $diff as $k=>$v)
     {
    $i++;
      echo 
    $v."]-[".$k."]-[".$sbit[$i]."<br>";
     }

    Ich komm da nicht mehr weiterhat jemand einen tipp für mich?
    Danke 
    ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

  • #2
    Diesen inhalt möchte ich umsortieren, so das der inhalt danach so aussieht:
    Das geht nicht!
    "1152 x 864]-[32" kommt 3 mal vor.

    Ansonsten, bist du doch schon recht nah dran..
    PHP-Code:
    $datei1   "scr.txt";
    $datei2   "scr_neu.txt";


    function 
    transform(&$node,$key)
    {
      
    $node sprintf("%03d]-[%s\r\n",$node,$key);
    }


    $arr1       file($datei1);
    $sauber     array_map('trim',$arr1);
    $gezaehltes array_count_values($sauber);
    arsort($gezaehltes);
    array_walk($gezaehltes,'transform');
    file_put_contents($datei2,$gezaehltes); 
    Zuletzt geändert von combie; 28.06.2009, 13:13.
    Wir werden alle sterben

    Kommentar


    • #3
      *seufz*, ich poste es trotzdem.

      Edit: Dreistellige Zahlen werden bei 120.000 Einträgen vielleicht etwas knapp.

      PHP-Code:
      $tmp = array();
      $fh fopen('./scr.txt''r');

      while (!
      feof($fh))
      {
          
      $line trim(fgets($fh));
          
      $tmp[$line] = (!isset($tmp[$line])) ? $tmp[$line] + 1;
      }

      fclose($fh);

      $resolutions = array();

      foreach (
      $tmp as $key => $value)
      {
          
      $resolutions[] = array($key$value);
      }

      usort($resolutionscreate_function('$a, $b',
              
      'if ($a[1] < $b[1]) return 1;
              if ($a[1] > $b[1]) return -1;
              return ($a[0] < $b[0]);'
      ));

      foreach (
      $resolutions as $line)
      {
          echo 
      sprintf('%03d'$line[1]) . ']-[' $line[0] . '<br />';

      Zuletzt geändert von mermshaus; 28.06.2009, 13:16. Grund: fclose vergessen

      Kommentar


      • #4
        @webmaster

        Jedesmal wenn ich mich im Forum anmelde un GO klicke, kommt ein kleines fensterchen und das will mich damit veräppeln:
        PHP-Code:
        Portal-Login fehlgeschlagen
        Der angegebene Benutzer wurde nicht gefunden
        !
        Weiter 
        ...anfangs bin ich auf den trick reingefallen, aber wenn ich die seite einfach aktualisiere, dann bin ich trotz der fehlermeldung angemeldet.


        @mermshaus
        Erstmal vorweg, dein script funktioniert super...problem meinerseits: das ist mir irgendwie zu hoch ich habe sowas: create_function('$a, $b', noch nie gesehen :-(


        @combie
        Dein beispiel kann ich viel besser verdauen :-) Danke funktioniert super.
        Ab hier hab ich dann schon wieder paar lücken:
        PHP-Code:
        arsort($gezaehltes);
        array_walk($gezaehltes,'transform'); 
        arsort, sortiert nur nach der ersten spalte, also die die hiermit erzeugt wird:
        PHP-Code:
        echo sprintf('%03d'$line[1])... 
        kann man diesem arsort auch beibringen das ich nach dem 2ten arrayelement oder dem 3ten sortiert haben möchte? (das soll später nur für die ausgabe sein, also es wird dann nur mit der neu erzeugten datei weitergearbeitet.
        Aufbau:
        003884]-[1024 x 768]-[32
        ...
        ...
        )

        Dann noch eine frage hierzu:
        PHP-Code:
        array_walk($gezaehltes,'transform'); 
        mit dem 'transform' wird die funktion aufgerufen, das ist doch richtig oder?
        Ich frag nur weil hier der name der funktion in hochstrichchen steht!
        ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

        Kommentar


        • #5
          kann man diesem arsort auch beibringen das ich nach dem 2ten arrayelement oder dem 3ten sortiert haben möchte?
          Nein.
          Du suchst dann usort(), uasort() o,ä.

          ich habe sowas......, noch nie gesehen :-(
          Das Handbuch gibt gerne Auskunft.

          mit dem 'transform' wird die funktion aufgerufen, das ist doch richtig oder?
          Ich frag nur weil hier der name der funktion in hochstrichchen steht!
          Richtig! Das nennt sich "Callback".
          Auch hier könntest du das Handbuch befragen.

          Ich mag keine Schleifen....
          Wir werden alle sterben

          Kommentar


          • #6
            Ich hab da was zum sortieren gefunden....es tut aber nicht, keine sortierung und keine fehlermeldung :-(

            PHP-Code:
            <?php error_reporting(E_ALL);
            #Aufruf: aasort($sort, array("-sort,[weiteres Feld]"));
            #$sort = ARRAY
            #-sort = feldname von oben nach unten
            #+sort = feldname von unten nach oben
            # eigendlich ist es gedacht für assoziative Arrays(nach meheren Feldern) zu sordieren.

            $arr[0] = "002903]-[1280 x 1024]-[32";
            $arr[1] = "000525]-[1024 x 768]-[16";
            $arr[2] = "000113]-[800 x 600]-[16";
            $arr[3] = "000153]-[1024 x 768]-[24";
            $arr[4] = "000010]-[1600 x 1200]-[32";

            aasort($arr, array("+sort,1"));
            echo 
            "<pre>";
            print_r($arr);
            echo 
            "</pre>";

            function 
            aasort(&$arr$args)
             {
            $args=array_reverse($args);
              foreach(
            $args as $arg)
               {
            $tmp_arr=$arr$arr=array();
                
            $order_key=substr($arg,1,strlen($arg));
                foreach(
            $tmp_arr as $index=>$nirvana)
                 {
            $sort_arr[$index]=$tmp_arr[$index][$order_key];}
                (
            $arg[0]=="+") ? (asort($sort_arr)):(arsort($sort_arr));
                foreach(
            $sort_arr as $index=>$dummy)
                 {
            $arr[$index]=$tmp_arr[$index];}
               }
             }
            ?>
            Ich dachte mir folgendes:

            aasort($arr, array("+sort,0"));
            aasort($arr, array("-sort,0"));
            sortiert mir das erste arrayelement auf/abwärts

            aasort($arr, array("+sort,1"));
            aasort($arr, array("-sort,1"));
            das gleiche für das 2te element

            Warum bewegt sich da nichts?
            ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

            Kommentar


            • #7
              Sonderlich sinnvoll sieht das ganze auf den ersten Blick jedenfalls nicht aus.

              Mit combies Hinweis auf usort & Co. fährst du m.E. deutlich besser bei solchen Vorhaben.
              Auf jeden Fall besser, als mit kopiertem Code, den du vorne und hinten nicht verstehst.
              Zuletzt geändert von wahsaga; 28.06.2009, 22:18.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Ja danke für den Hinweis...wäre mir jetzt auf die schnelle garnicht aufgefallen :-)

                Naja wenn ichs jemals zu 100% kann, dann seit ihr mich los.....immer diese anfänger mit ihren dämlichen fragen hier....also ich wär dafür ne sperree hier einzubauen
                >Nur die die 100-150% PHP kenntnisse haben dürfen hier fragen posten<
                Dat wärs doch wa?

                Einen schönen wochenanfang allerseits
                ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                Kommentar


                • #9
                  Was reagierst du so pampig....?

                  Naja wenn ichs jemals zu 100% kann, dann seit ihr mich los...
                  Ich dachte, dann hätten wir eine kompetente Helferin gewonnen..
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    Ich verstehe es so das es um eine einmalige Umsortierung geht.

                    Ich würde mir das sau bequem machen, ein Tabelle in Mysql anlegen, die Datei dort importieren und dann kann man alles so sortieren und zählen wie man möchte und auch wieder ausgeben - fertig wäre der Salat.

                    Kommentar


                    • #11
                      Hi...

                      >Was reagierst du so pampig....?
                      Tu ich doch nicht, bin nur etwas sauer...der warsaga mag mich nicht, is ja auch recht aber seine postings helfen mir wenig weiter...
                      Hab jetzt sein post in den code eingebaut aber php meint das es solche funktionen in php nicht gibt:-)

                      Ok jungs wollen wir es wieder anpacken, waffen begraben und dem mädl da mal bissl helfen?
                      Ja ich bin nicht die hellste, aber bevor ich paar 1000 euro hinlege damit mir eine firma das macht, mach ichs selber oder ich vergiss das einfach.

                      Also, falls ihr mich noch mögen tut:-)

                      Meine daten liegen jetzt in dieser form vor, bzw sie werden von einem php script so aufgezeichnet und damit müßen wir jetzt weiterarbeiten:
                      PHP-Code:
                      User      Auflösungen    Farbtiefen

                      003884
                      ]-[1024 x 768]-[32]-[
                      002903]-[1280 x 1024]-[32]-[
                      001822]-[1440 x 900]-[32]-[
                      001155]-[1280 x 800]-[32]-[
                      000668]-[1152 x 864]-[32]-[
                      000659]-[1680 x 1050]-[32]-[
                      000525]-[1024 x 768]-[16]-[
                      000238]-[1280 x 1024]-[16]-[
                      000212]-[1600 x 1200]-[32]-[
                      000182]-[1920 x 1200]-[32]-[
                      000164]-[1280 x 960]-[32]-[
                      000162]-[1400 x 1050]-[32]-[
                      000158]-[800 x 600]-[32]-[
                      000153]-[1024 x 768]-[24]-[ 
                      Daraus möchte ich jetzt einen eue statistik machen, und zwar möchte ich jetzt in eiener tabelle folgendes angezeigt bekommen:

                      PHP-Code:
                      Bildschirmauflösungen

                      Breite x Höhe    User
                      ---------------------
                      1024 x 768         3884     
                      1280 x 1024         2903     
                      1440 x 900         1823     
                      1280 x 800         1155     
                      1152 x 864          668     
                      1680 x 1050          659     
                      1024 x 768          525     
                      1280 x 1024          238     
                      1600 x 1200          212     
                      1920 x 1200          182     
                      1280 x 960          164     
                      1400 x 1050          162     
                      800 x 600            158     
                      1024 x 768          153 
                      Dieses Ergebnis macht mir dieser Scriptbereich:
                      PHP-Code:
                      $arr3=@file("screen.txt"); $tot=count($arr3);

                      # Anzahl aller User ermitteln
                      foreach($arr3 as $zeile) {$zt=explode("]-[",trim($zeile)); $user=$user+$zt[0];}

                      # höchster Wert ermitteln
                      foreach($arr3 as $zeile) {$zt=explode("]-[",trim($zeile)); if($zt[0]>$vmax){$vmax=$zt[0];}}

                      foreach(
                      $arr3 as $zeile)
                       {
                      $zt=explode("]-[",trim($zeile));
                        
                      $iw=intval($zt[0]*$grb/$vmax);
                        
                      $iw2=intval($grb-$iw);
                        echo 
                      "  <tr style='background:$col'>\n";
                        echo 
                      "   <td class='sp1'>".(!empty($zt[1])? $zt[1]:'<strong>Javascript deaktiviert</strong>')."</td>\n";
                        echo 
                      "   <td class='sp2'>".intval($zt[0])."</td>\n";
                        echo 
                      drawBar($iw,$iw2,"p"); # Zeichnet eine horiz. Grafik
                        
                      echo "  </tr>\n";
                       }
                      echo 
                      "  <tr class='bot'><td>&nbsp;Insgesamt:</td><td class='sp2'>".$user."</td><td></td></tr>\n"
                      Ok wer lachen möchte der darf das :-)
                      Aber ha hab ich schon ein Problem, und zwar:
                      kommt 1024 x 768 mehrmahls vor, einmal als 32 bit und einmal als 24 bit

                      Das script sollte hier die Auflösung nur einmal zählen, falls sie mehrfach vorkommt, und soll dabei die anzahl der user addieren....
                      Beispiel: am ende soll dann aus diesen 3 einträge
                      PHP-Code:
                      003884]-[1024 x 768]-[32]-[
                      000525]-[1024 x 768]-[16]-[
                      000153]-[1024 x 768]-[24]-[

                      das angezeigt werden:
                      1024 x 768   4562

                      4562 
                      3884 525 153 
                      Ich stell mir das so vor: es wird erst $zt[1] geprüft, und falls es mehrfach vorkommt, wird es nur einmal ausgegeben aber die entsprechenden werte in $zt[0] werden addiert.

                      Ihr wißt ja ich mach kurzen code, wenn das einlesen + auswerten dieser datei schneller mit weniger code und wenn das auch noch sauschnell ist dann hab ihr mir diesen Tag versüßt
                      ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                      Kommentar


                      • #12
                        Zitat von RamonaS Beitrag anzeigen
                        Tu ich doch nicht, bin nur etwas sauer...der warsaga mag mich nicht, is ja auch recht aber seine postings helfen mir wenig weiter...
                        Das hat nichts mit "mögen" auf persönlicher Ebene zu tun - sondern mit der Art, wie du hier im Forum agierst.

                        Hab jetzt sein post in den code eingebaut aber php meint das es solche funktionen in php nicht gibt:-)
                        Siehst du, genau sowas meine ich - wieder mal nur unklares Geschwurbel, statt konkreter Fakten!

                        Was für eine "Funktion" hast du wo eingebaut, und was genau meldet PHP dazu?
                        Solche Basisbestandteile einer vernünftigen Problembeschreibung lassen sich per Copy&Paste in ein Posting einfügen - das kann doch wohl nicht zu viel verlangt sein?


                        Aber ha hab ich schon ein Problem, und zwar:
                        kommt 1024 x 768 mehrmahls vor, einmal als 32 bit und einmal als 24 bit

                        Das script sollte hier die Auflösung nur einmal zählen, falls sie mehrfach vorkommt, und soll dabei die anzahl der user addieren....
                        Na gut, dann machen wir das doch.

                        Der Zeichenketten-Wert für die jeweilige Auflösung, "1024 x 768" lässt sich gut als Schlüssel für ein assoziatives Array nehmen.
                        Für jede Zeile aus der Datendatei (Schleife) machen wir also folgendes:
                        Schauen, ob es schon einen Eintrag im Array gibt, der die Auflösung als Schlüssel hat.
                        Wenn nein - dann wird ein solcher angelegt, und bekommt die aktuelle User-Zahl dieser Zeile als Wert.
                        Wenn ja - dann wird auf den aktuell enthaltenen Wert einfach die User-Zahl der aktuellen Zeile draufaddiert.

                        Das so entstehende Array lässt sich dann anschliessend noch ganz fix mittels arsort sortieren, wenn die Werte in absteigender Häufigkeit gelistet werden sollen.

                        Anschliessend machen wir dann noch mal eine Schleife über das eben erstellte und sortierte Array, und erst in dieser Schleife machen wir dann die Ausgabe.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Man mache sich eine Tabelle in einer Mysql DB
                          hier DB test tabelle a

                          CREATE TABLE IF NOT EXISTS `a` (
                          `anzahl` int(11) NOT NULL,
                          `l` int(11) NOT NULL,
                          `b` int(11) NOT NULL
                          ) ENGINE=MyISAM ;

                          Dann krixel man sich ein kleines Script:

                          PHP-Code:
                          <?php
                          $db
                          = @mysql_connect('localhost','root','',MYSQL_CLIENT_COMPRESS);
                          @
                          mysql_select_db('test');
                          $daten=explode("\n",file_get_contents('test.txt')); 
                          foreach (
                          $daten as $one)

                            
                          $dta=explode(']-[',$one);
                              
                          $auf=explode(' x ',$dta[1]);
                              @
                          mysql_query("INSERT INTO `test`.`a` (`anzahl` ,`l`,`b`)VALUES ('".ltrim($dta[0],'0')."',".$auf[0].",".$auf[1].")");
                          }
                              
                          $result mysql_query("SELECT l,b,SUM(anzahl) FROM a GROUP BY l ORDER BY l,b");
                              while(
                          $row mysql_fetch_array($result))
                                  echo 
                          "Total "$row['SUM(anzahl)']. " "$row['l'].' x '.$row['b'].'<br />';
                          ?>
                          Dann erhält man aus den Testdaten

                          003884]-[1024 x 768]-[32]-[
                          002903]-[1280 x 1024]-[32]-[
                          001822]-[1440 x 900]-[32]-[
                          001155]-[1280 x 800]-[32]-[
                          000668]-[1152 x 864]-[32]-[
                          000659]-[1680 x 1050]-[32]-[
                          000525]-[1024 x 768]-[16]-[
                          000238]-[1280 x 1024]-[16]-[
                          000212]-[1600 x 1200]-[32]-[
                          000182]-[1920 x 1200]-[32]-[
                          000164]-[1280 x 960]-[32]-[
                          000162]-[1400 x 1050]-[32]-[
                          000158]-[800 x 600]-[32]-[
                          000153]-[1024 x 768]-[24]-[

                          Das Ergebnis

                          Total 158 800 x 600
                          Total 4562 1024 x 768
                          Total 668 1152 x 864
                          Total 4460 1280 x 1024
                          Total 162 1400 x 1050
                          Total 1822 1440 x 900
                          Total 212 1600 x 1200
                          Total 659 1680 x 1050
                          Total 182 1920 x 1200

                          und das Thema ist fast erledigt (statt Screen Ausgabe ist wohl etwas anderes zu machen).

                          Wenn einem die Sortierung nicht passt legt man das Order by auf etwas anders und fertig.

                          Kommentar


                          • #14
                            Hallo

                            Ok also ich hab deinen Rat mal befolgen wollen und bin bis hier her gekommen, weiter gehts jetzt erst mal nicht.
                            Ich muß dem script ja beibringen, sich alle werte die es bereits durchlaufen hat - sich zu merken.

                            Soll ich jetzt ein neues array dazu anlegen?

                            Übrigens $k aus dem array ist für die katz, da ist ja nur ne laufende nummer drin, die brauch ich garnicht und in $v ist dann gleich alles drin, das ich dann wieder per explode zerlegen muß.


                            PHP-Code:

                            $arr3
                            =file("screen2.txt"); $tot3=count($arr3);

                            foreach(
                            $arr3 as $zeile) {$zt=explode("]-[",trim($zeile)); $user=$user+$zt[0];} # Anzahl aller User ermitteln

                            foreach($arr3 as $k=>$v)
                             {
                            $zt=explode("]-[",trim($v));
                              echo 
                            "<br />".$zt[0];
                              
                            # if($zt[1])...???
                             


                            PHP-Code:
                            ab jetzt sein post in den code eingebaut aber php meint das es solche funktionen in php nicht gibt:-)

                            Siehst dugenau sowas meine ich wieder mal nur unklares Geschwurbelstatt konkreter Fakten
                            Och mann-oh...das war als witz gemeint, deshalb hatte ich das satzende mit :-) geschmükt.
                            Ok keine witze mehr, ich will ja schließlich mein zeugs hier zum laufen bringen.
                            ACHTUNG: RamonaS zeigte ein beschämendes Verhalten in der Vergangenheit

                            Kommentar


                            • #15
                              Zitat von RamonaS Beitrag anzeigen
                              Ich muß dem script ja beibringen, sich alle werte die es bereits durchlaufen hat - sich zu merken.

                              Soll ich jetzt ein neues array dazu anlegen?
                              Aus den zwei foreach-Schleifen kannst du eine machen - jede Zeile aus der Datendatei wird in ihre Bestandteile zerlegt, und diese werden dann direkt anschliessend verarbeitet.

                              Mal als Pseudocode:
                              Code:
                              $zeilenArray = Array mit den Zeilen aus der Datei
                              
                              $summierteWerte = array(); // neues, leeres Array initialisieren
                              
                              foreach($zeilenArray as $zeile) {
                              
                                zerlege $zeile in die Bestandteile $anzahl, $aufloesung und $farbtiefe
                              
                                wenn es in $summierteWerte noch keinen Eintrag mit dem Schlüssel $aufloesung gibt
                                  dann lege ihn an, und weise ihm die aktuelle $anzahl zu
                                sonst
                                  addiere die aktuelle $anzahl auf den Inhalt dieses Eintrages drauf
                              
                              }
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X