Der Mark: Jeden x-ten Eintrag überspringen

Hallo zusammen,
bin zwar in Mathematik keine Niete, stehe aber irgendwie dennoch etwas auf dem Schlauch und suche gerade eine Lösung für ein Problem. Ich beschreibe mal worum es geht.

Ich habe einen Datenbestand von zB 20000 Datensätzen. Es ist mir aber nur gestattet 10000 Datensätze davon zu verarbeiten. Logischerweise muss ich also jeden 2ten Datensatz verwerfen. Wären es 15000 nur jeden 3ten. Diese "einfachen" Zahlen stellen nicht das Problem dar. Komplizierter wird es mit Zahlen ala 26583, denn der Datenbestand ist variierend (mal mehr mal weniger). Ich hatte mir gedacht, ich erstelle mir einen Wert, der angibt den wie vielten Datensatz ich überspringen muss:

$overstep = 10000 / ($result_count - 10000);

Anschließend überprüfe ich via Modulo ob der "Zeitpunkt" zum überspringen erreicht wurde.

if($rowcount % $overstep != 0) {  
   // ausgabe  
}  
else {  
   // keine Ausgabe  
}

Das sah zwar anfangs ganz toll aus... geht aber nicht :o) Hat jemand einen Idee, Anregung, Lösung für mich?

Danke
Der Mark

  1. Hallo Mark,

    wo kommen die Datensätze denn her?
    Und warum gilt die Begrenzung nur für die Ausgabe und nicht die Abfrage?
    Oder ist es nicht so?

    Grüße, Matze

    1. Hallo Mark,

      wo kommen die Datensätze denn her?
      Und warum gilt die Begrenzung nur für die Ausgabe und nicht die Abfrage?
      Oder ist es nicht so?

      Grüße, Matze

      Die Daten sind eine zeitliche Aufzeichnung einer Geoposition. Die Daten können ruhig ungenauer werden durch auslassen der Daten nur eben ich brauche von Anfang bis Ende in der FIFO Reihenfolge.

      Gruß
      der Mark

  2. Hallo Mark,

    Komplizierter wird es mit Zahlen ala 26583, denn der Datenbestand ist variierend (mal mehr mal weniger).

    misch die Datensätze und nimm nur die ersten 10000 Datensätze.

    Freundliche Grüße

    Vinzenz

    1. Hallo Mark,

      »» Komplizierter wird es mit Zahlen ala 26583, denn der Datenbestand ist variierend (mal mehr mal weniger).

      misch die Datensätze und nimm nur die ersten 10000 Datensätze.

      Freundliche Grüße

      Vinzenz

      Das geht leider nicht, denn die "zeitliche" Reihenfolge der Daten muss bestehen bleiben und des darf nicht gemischt werden. Es dreht sich um eine Aufzeichnung dessen Daten durchaus ausgedünnt werden können nur eben nicht durcheinander gewürfelt. Sonst könnte ich auch einfach die ersten 10k nehmen.

      Gruß
      der Mark

      1. Hallo,

        » »» Komplizierter wird es mit Zahlen ala 26583, denn der Datenbestand ist variierend (mal mehr mal weniger).

        Das geht leider nicht, denn die "zeitliche" Reihenfolge der Daten muss bestehen bleiben und des darf nicht gemischt werden. Es dreht sich um eine Aufzeichnung dessen Daten durchaus ausgedünnt werden können nur eben nicht durcheinander gewürfelt. Sonst könnte ich auch einfach die ersten 10k nehmen.

        wenn Du gleichmäßig ausdünnen willst/musst, ist die Mischmethode nicht geeignet. Nimm in diesem Fall für alle i aus 1 bis 10000 (d.h. bis obere Grenze) den ganzzahligen Anteil von

        i * Gesamtzahl / gewünschte Anzahl

        also die Elemente 2, 5, 7, 10, ...

        Das ist nichts anderes als das, was Cheatah Dir vorschlug. Wenn Du mit Arrays, deren Index von 0 an durchnumeriert ist, arbeitest, wirst Du die notwendigen Änderungen selbst hinbekommen.

        Freundliche Grüße

        Vinzenz

  3. Hallo,

    Ich habe einen Datenbestand von zB 20000 Datensätzen. Es ist mir aber nur gestattet 10000 Datensätze davon zu verarbeiten. Logischerweise muss ich also jeden 2ten Datensatz verwerfen. Wären es 15000 nur jeden 3ten.

    $overstep = 10000 / ($result_count - 10000);

    hier sitzt der Denkfehler: Dass dieser Ausdruck falsch sein muss, siehst du schon daran, dass sich eine Division durch 0 ergibt, wenn $result_count = 10000 ist.
    Nein, du musst hier einfach die tatsächliche Zahl der Datensätze ($result_count) zur maximal zulässigen ins Verhältnis setzen. Den so erhaltenen Quotienten solltest du noch auf den nächstkleineren ganzzahligen Wert abrunden, da die Modulo-Operation nur für Ganzzahlen definiert ist, und falls du dann 0 herausbekommst (nämlich dann, wenn $result_count<10000 ist), solltest du den Wert wieder auf 1 setzen - sonst fällt nachher der Modulo-Operator wegen "Division by zero" auf die Klappe.

    if($rowcount % $overstep != 0) {

    // ausgabe
    }
    else {
       // keine Ausgabe
    }

      
    Dann klappt's auch mit diesem Ansatz.  
    Übrigens: Der passendere englische Ausdruck wäre "skip". Es gibt zwar auch "to overstep", das bedeutet aber eher sowas wie eine juristische oder moralische Grenze zu überschreiten, oder sich über eine Beschränkung hinwegzusetzen.  
      
    So long,  
     Martin  
    
    -- 
    Wenn die Amerikaner eines Tages von jeder Tierart ein Pärchen nach Cape Canaveral treiben ...  
    ja, DANN sollte man endlich misstrauisch werden.
    
    1. Hi Martin,

      Nein, du musst hier einfach die tatsächliche Zahl der Datensätze ($result_count) zur maximal zulässigen ins Verhältnis setzen. Den so erhaltenen Quotienten solltest du noch auf den nächstkleineren ganzzahligen Wert abrunden, da die Modulo-Operation nur für Ganzzahlen definiert ist, und falls du dann 0 herausbekommst (nämlich dann, wenn $result_count<10000 ist), solltest du den Wert wieder auf 1 setzen - sonst fällt nachher der Modulo-Operator wegen "Division by zero" auf die Klappe.

      Wenn ich das soweit richtig umgesetzt habe sollte das gemeint sein, oder? Habe es auch in skip umgenannt :o)

      $skip = floor($result_count / 10000);  
      if($skip == 0)  
         $skip = 1;
      

      »» ~~~php

      if($rowcount % $overstep != 0) {

      »»    // ausgabe
      »» }
      »» else {
      »»    // keine Ausgabe
      »» }

      
      >   
      > Dann klappt's auch mit diesem Ansatz.  
        
      Theoretisch und praktisch führt das aber letztlich doch dazu, das bei $skip == 1 die if eine Abfrage nach rowcount % 1 == 0 ergibt. Das hat zur Folge, dass gar nichts mehr verarbeitet wird. Gut das sind dann zwar weniger als 10000 Daten ... aber leider auch zu wenige :D  
        
      Gruß
      
      1. Hallo,

        Wenn ich das soweit richtig umgesetzt habe sollte das gemeint sein, oder? Habe es auch in skip umgenannt :o)

        $skip = floor($result_count / 10000);

        if($skip == 0)
           $skip = 1;

          
        so hatte ich es gemeint.  
          
        
        > Theoretisch und praktisch führt das aber letztlich doch dazu, das bei $skip == 1 die if eine Abfrage nach rowcount % 1 == 0 ergibt. Das hat zur Folge, dass gar nichts mehr verarbeitet wird. Gut das sind dann zwar weniger als 10000 Daten ... aber leider auch zu wenige :D  
          
        Stimmt. Du denkst aber verkehrt herum: Lass $skip=4 sein, du möchtest also jeden 4. Eintrag verarbeiten. Also darfst du nur diejenigen verarbeiten, bei denen $rowcount % $skip == 0 ergibt:  
          
          $rowcount   $rowcount%4  
             17           1  
             18           2  
             19           3  
             20           0  ->> eintragen!  
             21           1  
             22           2  
             23           3  
             24           0  ->> eintragen!  
             25           1  
             26           2  
          
        Das funktioniert dann auch noch mit $skip==1, da ergibt die Modulo-Operation tatsächlich immer 0, also wird jeder Eintrag verarbeitet.  
          
        Alles klar?  
         Martin  
        
        -- 
        Der Bäcker schlägt die Fliegen tot  
        Und macht daraus Rosinenbrot.
        
        1. Hi,

          »» $skip = floor($result_count / 10000);
          »» if($skip == 0)
          »»    $skip = 1;[/code]

          so hatte ich es gemeint.

          und das stimmt nicht ganz. Richtig wäre:

          $skip = floor($result_count/10000) +1;

          Warum? - Du willst ja ab 10000 Datensätzen nur jeden zweiten, ab 20000 nur jeden dritten usw., also müssen alle Werte von 0..9999 auf 1, alle von 10000..19999 auf 2, alle von 20000..29999 auf 3 abgebildet werden usw.
          Also nicht nur bei 0 um 1 erhöhen, sondern bei jedem Wert.

          Ciao,
           Martin

          --
          Heutzutage gilt ein Mann schon dann als Gentleman, wenn er wenigstens die Zigarette aus dem Mund nimmt, bevor er eine Frau küsst.
            (Barbra Streisand, US-Schauspielerin)
  4. Hi,

    Ich habe einen Datenbestand von zB 20000 Datensätzen. Es ist mir aber nur gestattet 10000 Datensätze davon zu verarbeiten. Logischerweise muss ich also jeden 2ten Datensatz verwerfen.

    schlechter Ansatz. Besser: Du musst jeden zweiten nehmen.

    Wären es 15000 nur jeden 3ten.

    Jeden einskommafünften.

    Diese "einfachen" Zahlen stellen nicht das Problem dar. Komplizierter wird es mit Zahlen ala 26583,

    Jeden zweikommasechsfünfachtdritten. Kein Problem.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah,

      Jeden zweikommasechsfünfachtdritten. Kein Problem.

      xD
      Sowas erinnert mich immer wieder daran wie mir ein damaliger Mentor völlig begeistert zum ersten mal die Grundfunktionen von Excel erklärt hat.

      Mentor: "Hier, schau dir das mal an, das ist total cool. IxSchell [sic] von Micro$oft!"
      Matze: "Cool, zeig mal!"
      Dann folgte die Demonstration dieser absolut überlegenen Software...
      Mentor: "Schau, wenn ich hier 10 und da 10... und das dann Mal rechne... zack steht da 100."
      Matze: "Schon toll, aber das kann ich im Kopf schneller."

      Wir beide wussten nicht was man so alles mit Excel anfangen kann, aber er war danach irgendwie... geknickt^^

      BTT:
      Ich kann das "Problem" des OP irgendwie nicht nachvollziehen.
      Wieso will er ausgerechnet jeden xten Datensatz?
      Wieso nicht einfach die ersten 10k?
      Wenn beliebige Datensätze übersprungen werden können, dürften doch die ersten 10k ausreichend sein.
      Und wenn er Zugriff auf alle Datensätze hat, wieso will er dann nur jeden xten ausgeben? Was geschieht mit den restlichen? Irrelevant? Dann löschen bis man wieder auf 10k ist, fertig.
      Oder falls die Daten aus einer Datenbank kommen, gibts doch sicher auch ein schönes SELECT-Statemente für sowas.

      Irgendwie versteh ich das Problem nicht ;)

      Grüße, Matze

      1. @@Matze:

        nuqneH

        Irgendwie versteh ich das Problem nicht ;)

        Du eine Animation von x Sekunden Länge, bei einer Framerate von 25 Hz macht das 25x Frames (Einzelbilder).

        Die Animation willst du nun zusammenstauchen auf 400 Sekunden, also auf 10000 Frames.

        Welche Frames wählst du aus?

        Qapla'

        --
        Bildung lässt sich nicht downloaden. (Günther Jauch)
        1. Hallo Gunnar,

          touché! Danke!
          Ich denk auch grad an Statistiken.
          Wenn ich einen aufsteigenden Wert inklusive Anfang und Ende darstellen will,
          muss ich auch nicht jeden einzelnen Datensatz berücksichtigen. Börsenkurse z.B.

          Aber trotzdem, wenn die Werte aus einer DB kommen, kann man das doch sicher auch über das SELECT-Statement lösen, oder?

          Offtopic:
          Der bei der IANA registrierte Sprachcode für die klingonische Sprache ist „i-klingon“, der ISO-639-2-Code ist „tlh“. Klingonisch ist also als eine echte Sprache anerkannt.

          Bedeutet das, dass ich die Zeichen auch mit UTF-8 darstellen kann?
          Bitte um Beispiele! :)

          Grüße, Matze

          1. @@Matze:

            nuqneH

            Der bei der IANA registrierte Sprachcode für die klingonische Sprache ist „i-klingon“

            Das hat dir der Teu^W^Wdie Wikipedia gesagt‽ Die Information ist veraltet.

            Der bei der IANA registrierte Sprachcode für die klingonische Sprache ist "tlh". [IANA-language-subtag-registry]

            Bedeutet das, dass ich die Zeichen auch mit UTF-8 darstellen kann?

            “The Klingon pIqaD script was on the Roadmap for inclusion in Unicode for several years before it was rejected.” [Klingon-FAQ]

            “[…]pIqaD -style metafont character set mapped to a specific region of the Unicode Private Use Area” [ibid.]

            Using pIqaD in Windows

            Qapla'

            --
            Bildung lässt sich nicht downloaden. (Günther Jauch)