Antworten auf deine Fragen:
Neues Thema erstellen

Werte mit ähnlicher Uhrzeit zusammenfügen

KATERchen

Aktives Mitglied

Hallo,
in meiner Datenbank habe ich Einträge mit Uhrzeit und Wert A ODER Wert B
Code:
[FONT=Courier New]Zeit       A    B

02:41     4.7       
11:01     8.3      
11:02           5.0
18:54     6.0      
19:30           6.0
19:51           5.0
20:27     13.5      
20:29           3.0
22:07           5.0[/FONT]
Diese sollen nun aber so ausgegeben werden, dass A und B in der gleichen Zeile stehen, wenn die Uhrzeit in etwa übereinstimmt. Also zum Beispeil:
Code:
[FONT=Courier New]11:01    8.3  5.0
20:27   13.5  3.0[/FONT]
Die Toleranz muss natürlich vorher festgelegt werden, schon klar :)
Hat jemand ne Idee für mich?
 

saila

Moderatorle

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Hi,

Daten aus DB lesen und dann als Array auswerten. Ist schneller. Du musst lediglich noch in der WHERE die Uhrzeit > und < angeben. Danach kannst du über die foreach- oder while-Schleife die passenden Werte in eine Zeile bringen.
 

Duddle

Posting-Frequenz: 14µHz

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Du musst möglicherweise noch ein paar Zeitumrechnungen machen und die Funktionen deinem DBMS anpassen, aber es funktioniert prinzipiell so:

Code:
SELECT k1.zeit, k1.a, k2.b 
FROM kater k1
JOIN kater k2
ON ABS(k1.zeit-k2.zeit) < 5
WHERE k1.a IS NOT NULL
AND k2.b IS NOT NULL

Dabei nehme ich an, dass deine leeren Werte NULL entsprechen, die Zeitwerte direkt miteinander verrechenbar sind, die Absolutwert-Funktion ABS() zur Verfügung steht, und deine Tabelle "Kater" heisst. Die 5 ist dann der entsprechende Toleranzwert.


Duddle
 

KATERchen

Aktives Mitglied

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Du musst möglicherweise noch ein paar Zeitumrechnungen machen und die Funktionen deinem DBMS anpassen, aber es funktioniert prinzipiell so:

Code:
SELECT k1.zeit, k1.a, k2.b 
FROM kater k1
JOIN kater k2
ON ABS(k1.zeit-k2.zeit) < 5
WHERE k1.a IS NOT NULL
AND k2.b IS NOT NULL
Dabei nehme ich an, dass deine leeren Werte NULL entsprechen, die Zeitwerte direkt miteinander verrechenbar sind, die Absolutwert-Funktion ABS() zur Verfügung steht, und deine Tabelle "Kater" heisst. Die 5 ist dann der entsprechende Toleranzwert.


Duddle

Okay, sieht erst mal logisch aus, kostet mich aber sicherlich einige Zeit. Daher frage ich lieber vorher, bevor sich sonst noch rausstellt, dass es doch nicht gehen kann... :)

Sehe ich das richtig, es ist ein JOIN innerhalb EINER Tabelle? Wußte gar nicht, das das geht. Aber ich weiß noch so vieles nicht... zum Beispiel auch, was ist DBMS ??? Und wie bekomme ich raus, ob ABS (was immer das ist) zur Verfügung steht? Aber das Script wird eh nur lokal laufen, also sollte ich das wohl einstellen können.
Und was meinst Du mit: "die Zeitwerte direkt miteinander verrechenbar sind"
 

Duddle

Posting-Frequenz: 14µHz

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Sehe ich das richtig, es ist ein JOIN innerhalb EINER Tabelle?
Ein JOIN nimmt als Argumente Tabellen. Eine Tabelle ist eine Tabelle ist eine Tabelle ;)

Datenbankmanagementsystem, also deine eingesetzte Software (MySQL, MSSQL, Oracle, ...).

Und was meinst Du mit: "die Zeitwerte direkt miteinander verrechenbar sind"
Dass du ohne Probleme z.B. Zeitwert1 - Zeitwert2 berechnen kannst. Falls du bspw. - warum auch immer - die Zeiten als Strings vorliegen hättest (also "17:28 Uhr"), müsstest du das erst umwandeln lassen.
Welchen Datentyp hast du beim Erstellen der Tabelle für die "Zeit"-Spalte angegeben? Bei MySQL gibt es u.a. DATETIME und TIMESTAMP, wobei mit letzterem einfacher gerechnet werden kann als mit ersterem. Aber wie erwähnt gibt es zur Not auch Funktionen zum Umwandeln (siehe Referenz).

Edit:
Und wie bekomme ich raus, ob ABS (was immer das ist) zur Verfügung steht?

ABS steht in der Regel für die Absolutwertfunktion bzw. Betragsfunktion. Das hat deine Datenbank sehr sicher im Repertoire.


Duddle
 
Zuletzt bearbeitet:

KATERchen

Aktives Mitglied

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Irgendwie komme ich jetzt gerade gar nicht mehr klar.
Die Zeit liegt als String vor. Die Daten werden alle von einer CSV-Datei eingelesen.
Das Umwandeln in einen Timestamp scheint zu klappen, aber kann ich das in MySQL nur als varchar übernehmen. Wenn ich sage, ich will es als Timestamp, verlangt er ein englisches Datum...
Für heute habe ich aber auch genut - gehe jetzt ins Bett. So, das hat PHP jetzt davon !!!
Bis morgen...
 

KATERchen

Aktives Mitglied

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Okay, ich komme beim besten Willen nicht weiter.
Das Auslesen aus der Datenbank klappt nicht, ich erhalten die irrsinnigsten Werte - und die auch noch doppelt und dreifach. Und wenn es funktionieren würde, würde er mir scheinbar auch NUR die zusammengefügten Werte ausgeben, oder?
Egal. Ich denke, es währe ohnehin besser, die Werte gleich richtig in die DB einzutragen, das würde mir später einiges erleichtern.
Aber auch hier komme ich keinen Schritt weiter.
Die einzelnen Werte werden aus einer *.csv ausgelesen, liegen also als Array vor. Anschließend werden sie in die Datenbank eingetragen. Also muss irgendwo dazwischen das zusammenführen passieren. Aber wie??? :':)':)'(

Noch mal zur Erklärung:
Wenn Wert A und Wert B in etwa zur gleichen Uhrzeit erstellt wurden, sollen sie gemeinsam mit einer der beiden Zeiten ausgegeben werden (welche ist egal). Wenn aber ein größerer Zeitabschnitt zwischen den Werten liegt, sollen sie ganz normal mit der entsprechenden Zeit angezeigt werden.

Hier mal ein Ausschnitt aus dem Array der CSV-Datei:
[3] ist ein Timestamp
Code:
[FONT=Courier New]Array
(
    [0] => 
    [1] => Sonntag
    [2] => 17.01.2010
    [3] => 1304295720
    [4] => 0
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => [COLOR=Red]5.0[/COLOR]
    [10] => 
    [11] => 1
    [12] => 
    [13] => 
    [14] => 
)
[/FONT][FONT=Courier New]bzw:

[/FONT][FONT=Courier New]Array
(
    [0] => 
    [1] => Sonntag
    [2] => 17.01.2010
    [3] => 1304410920
    [4] => [COLOR=Red]9.1[/COLOR]
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 0
    [10] => 
    [11] => 1
    [12] => 
    [13] => 
    [14] => 
)[/FONT]
 

Duddle

Posting-Frequenz: 14µHz

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Da sehe ich zwei Ansätze:
Entweder prüfst du für jeden Datensatz, ob ein zeitnaher Datensatz schon in der DB steht und (wenn ja) updatest ihn dann nur mit dem zweiten Wert bzw. (wenn nein) trägst ihn neu in die DB ein.

Oder du machst das alles in PHP. Das heisst, du gehst für jeden Datensatz jeden anderen Datensatz durch und vergleichst die Zeiten jeweils paarweise. Ist das in der Toleranz, baust du dir den INSERT aus den zwei Datensätzen auf. Ansonsten besteht der INSERT nur aus dem ein einzelnen Datensatz. Dann merkst du dir noch, welche Datensätze du schon behandelt hast und überspringst die (um Doppelungen zu vermeiden).


Duddle
 
N

Nuc

Guest

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Ich würde die daten im php code "berechnen"
 

KATERchen

Aktives Mitglied

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Oder du machst das alles in PHP. Das heisst, du gehst für jeden Datensatz jeden anderen Datensatz durch und vergleichst die Zeiten jeweils paarweise. Ist das in der Toleranz, baust du dir den INSERT aus den zwei Datensätzen auf. Ansonsten besteht der INSERT nur aus dem ein einzelnen Datensatz. Dann merkst du dir noch, welche Datensätze du schon behandelt hast und überspringst die (um Doppelungen zu vermeiden).
Das hört sich am besten an, aber das ist auch das, woran ich gestern den ganzen Tag verzweifelt bin. Ich komme einfach nicht dahinter, WIE ich das vergleichen soll. Mit festen Werten ist das ja gar kein Problem - aber eben mit den ungefähren Werten komme ich absolut nicht klar.
Hier mal der Code, vom einlesen der CSV
PHP:
    $csv_file = 'tabelle.csv';
    $d = file($csv_file); 
    unset($d[0]); 
    $neu = implode("", $d); 
    $open = fopen($csv_file, "w+"); 
    fwrite($open, $neu); 
    fclose($open); 
    $Dateizeiger = fopen($csv_file, "r");

while(($daten = fgetcsv($Dateizeiger, 1000, ";")) !== FALSE){
    
    $csv_tag     = $daten[1];
    $csv_datum   = $daten[2];
    $csv_zeit    = $daten[3];
    
    if(empty($csv_tag)==FALSE){ // filtere leere Spalten aus    
    
    // Datum und Zeit umwandeln
    $csv_datum   = explode(".",$csv_datum);    
    $date        = sprintf($csv_datum[2].$csv_datum[1].$csv_datum[0]);
    $csv_zeit    = explode(":",$csv_zeit);
    $daten[3]    = mktime($csv_zeit[1],$csv_zeit[0],0,$csv_datum[0],$csv_datum[1],$csv_datum[2]);        

    if($daten[4] < 1){$daten[4] = 0;}
    if($daten[9] < 1){$daten[9] = 0;}
    
    $neu = array();
    $neu[1] = $daten[1];
    $neu[2] = $daten[2];
    
    if(in_array($daten[3], $neu)){}
 

Duddle

Posting-Frequenz: 14µHz

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Mein Vorschlag wäre, dass du die Daten erstmal in ein zweidimensionales Array packst (ausser die Datei ist unglaublich groß), dann kannst du imho besser damit hantieren. Damit meine ich also ein Array $foo, dessen Einträge wiederum die Arrays sind, die eine Zeile bei dir darstellen.

Dann gehst du schrittweise doppelt durch $foo, vergleichst also zuerst $foo[0][3] mit $foo[1][3] (wobei die 3 der Platz des Timestamps in deinem Beispiel war), dann $foo[0][3] mit $foo[2][3], usw. bis zum Ende. Danach vergleichst du $foo[1][3] mit $foo[2][3], $foo[1][3] mit $foo[3][3], usw. Dabei findest du jeweils heraus, ob die zwei Datensätze zusammengehören und erstellst dementsprechend deinen INSERT-Befehl.


Duddle
 

KATERchen

Aktives Mitglied

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Dann gehst du schrittweise doppelt durch $foo, vergleichst also zuerst $foo[0][3] mit $foo[1][3] (wobei die 3 der Platz des Timestamps in deinem Beispiel war), dann $foo[0][3] mit $foo[2][3], usw. bis zum Ende. Danach vergleichst du $foo[1][3] mit $foo[2][3], $foo[1][3] mit $foo[3][3], usw. Dabei findest du jeweils heraus, ob die zwei Datensätze zusammengehören und erstellst dementsprechend deinen INSERT-Befehl.
Aber WIE???
Wenn ich vergleichen soll, ob $foo[0][3] gleich 1306994640 ist, ist das schon klar, aber WIE vergleiche ich, ob $foo[0][3] IN ETWA gleich ist mit 1306994640? Da liegt mein Problem.
 

saila

Moderatorle

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

Hi,

da ja meine Tipp's für Katerchen nie richtig zu verstehen sind, dachte ich mir, warte mal....

Also nachdem nun geklärt ist wie und was. Hier ein neuer Versuch :)

Du hast bereits einen timestamp in der Datenbank hinterlegt, wenn ich mir das Array korrekt ansehe.

Nun zurück zu meinem ersten Posting hier. Wenn du in die Where-Bedingung einen timestamp hinterlegst, welcher

größer als und kleiner als einbindest, hast du den Tolleranzwert somit deffiniert. Das gleiche könntest du in der Schleife der Auswertung vornehmen.

Du fügst in deine Schleife eine if/else (oder auch if/elseif/else) Prüfung ein, welche letztlich wie in der WHERE-Bedingung auszusehen hat.

->start Edit:
Jetzt habe ich den Hinweis vergessen, wie du einen Timestamp generieren kannst.
Das geht per mktime(); Im Manual sind da reichlich Beispiele hinterlegt
-> end Edit

Wenn das alles mal steht, brauchst du lediglich noch die Datenbank auslesen (ohne innerJoins) und das ganze auf php-Basis auswerten. Es ist letztlich performanter (schneller) und entlastet die Datenbank, weil für die aktuelle Abfrage eine Tabelle temporäre erstellt wird, welche danach natürlich wieder gelöscht werden muss/wird.
 

KATERchen

Aktives Mitglied

AW: Werte mit ähnlicher Uhrzeit zusammenfügen

@saila
wenn ich Dich richtig verstehe :) ;) betrifft das doch wieder nur die Ausgabe der Daten aus der Datenbank - und dann auch nur die, die zusammen gehören. Oder nicht?

@Duddle
Kann man denn Werte in einem Array vergleichen und zusammen führen?

Naja, ich habe jetzt eine Lösung gefunden. Sicher nicht die eleganteste, aber es läuft.
PHP:
    for($i = 0; $i < count($neu_multi); $i++){  
        
        $tag     = $neu_multi[$i][0];
        $datum   = $neu_multi[$i][1];
        $time    = $neu_multi[$i][2];
        $zeit    = $neu_multi[$i][3];
        $bl      = $neu_multi[$i][4];
        $is      = $neu_multi[$i][5];

        if(($bl == 0 AND $is == 0)==FALSE){ // Zeilen ohne bl und is filtern
            
          if(isset($time_alt)){$abs = abs($time_alt[0] - $time);} // absoluter Wert aus alter Zeit und Zeit
    
            // Bei is vor Bl
            if($i > 0 AND $abs < $tolleranz AND $bl_alt[0] == 0 AND $bl > 0){    
                $is = $is_alt[0] + $is;        
                $eintrag = "UPDATE $tb_liste
                                        SET      is        = '$is',
                                                      bl        = '$bl',
                                                      timestamp = '$time'
                                        WHERE  timestamp = '$time_alt[0]'    ";
                $eintragen = mysql_query($eintrag)OR die(mysql_error());     
            }
    
            // Bei is nach Bl
            elseif($i > 0 AND $abs < $tolleranz AND $bl == 0){ 
                if($bl == 0){$bl = $bl_alt[0];}                
                $is = $is_alt[0] + $is;        
                $eintrag = "UPDATE $tb_liste
                                        SET      is        = '$is',
                                                      bl        = '$bl',
                                                      timestamp = '$time'
                                        WHERE  timestamp = '$time_alt[0]'    ";
                $eintragen = mysql_query($eintrag)OR die(mysql_error());     
            }
            
            // Neue Spalte erstellen
            else{        
            $eintrag = "INSERT    
                                    INTO $tb_liste
                                    SET  tag       =    '$tag',
                                             datum     =    '$datum',
                                             zeit      =    '$zeit',
                                             timestamp =    '$time',
                                             bl        =    '$bl',
                                             is        =  '$is'    ";
            $eintragen = mysql_query($eintrag)OR die(mysql_error()); 
            }
            
        if(isset($time_alt)){
        unset($time_ganzalt);
        $time_ganzalt = array($time_alt[0]);
        }    
        unset($time_alt);
        unset($bl_alt);
        unset($is_alt);
    
        $time_alt = array($time);    
        $bl_alt   = array($bl);    
        $is_alt   = array($is);    

        }
    }
Ich muss aber ganz ehrlich sein, dass ich nicht 100%ig nachvollziehen kann, was hier eigentlich passiert - da fehlt mir mal wieder die Vorstellungskraft. Den ersten Durchlauf kapiere ich noch, beim zweiten wird es schon schwieriger und beim Dritten...

Jetzt habe ich aber ein völlig komisches, ganz anderes Problem.
Auf einer zweiten Seite schreibe ich die die Datum-Werte in ein Array und filtere die doppelten Einträge mit array_unique aus.
Auf dem einen Rechner wird das auch richtig gemacht, aber auf einem anderen Rechner schmeißt er alles außer dem ersten Wert raus. Wie kann sowas sein?
So sieht das Array aus - natürlich mit doppelten Werten, die ich hier mal raus gelassen habe
Code:
[0] => Array
        (
            [0] => Sonntag
            [tag] => Sonntag
            [1] => 17.01.2010
            [datum] => 17.01.2010
        )
    . . .
    [5] => Array
        (
            [0] => Montag
            [tag] => Montag
            [1] => 18.01.2010
            [datum] => 18.01.2010
        )
    . . .
    [13] => Array
        (
            [0] => Dienstag
            [tag] => Dienstag
            [1] => 19.01.2010
            [datum] => 19.01.2010
        )
     . . .
Der code dazu
PHP:
    $datum_array = array();
    $ausgabe = mysql_query("SELECT tag, datum FROM $tb_liste") or die (mysql_error());
    while($row = mysql_fetch_array($ausgabe)){
    array_push($datum_array,$row);
}    
    $datum_einzeln = array_unique($datum_array);
$datum_array ist noch richtig, aber $daum_einzeln dann nicht mehr.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben