Autor | Zpráva | ||
---|---|---|---|
jtfcobra Profil |
#1 · Zasláno: 14. 9. 2016, 11:45:11
Prosím o radu jak zjistit že stroj
Když je nula v posledním sloupci tak stroj běží. Potřeboval bych vyčíst že stroj běžel od 14:00-14:30 celkem 30 minu 15:00-16:30 celkem 90 minu atd... 1903,"0.308","Pilat","2016-07-15","16:54:04","16.3","0.02","17.1","1" 1904,"0.308","Pilat","2016-07-15","16:54:14","16.3","0.02","17.1","1" 1905,"0.308","Pilat","2016-07-15","16:54:24","16.3","0.02","17.1","1" 1906,"0.308","Pilat","2016-07-15","16:54:34","16.3","0.02","17.1","1" 1907,"0.308","Pilat","2016-07-15","16:54:44","16.2","0.02","17.1","1" 1908,"0.316","Pilat","2016-07-15","16:54:54","16.3","1.47","17.1","0" 1909,"0.323","Pilat","2016-07-15","16:55:04","16.5","1.43","17.1","0" 1910,"0.330","Pilat","2016-07-15","16:55:14","16.9","1.49","17.1","0" 1911,"0.337","Pilat","2016-07-15","16:55:24","17.3","1.44","17.1","0" 1912,"0.343","Pilat","2016-07-15","16:55:34","18.0","1.44","17.0","0" 1913,"0.349","Pilat","2016-07-15","16:55:44","18.6","1.22","17.0","1" 1914,"0.349","Pilat","2016-07-15","16:55:55","19.2","0.02","17.0","1" 1915,"0.349","Pilat","2016-07-15","16:56:05","19.7","0.02","17.1","1" 1916,"0.349","Pilat","2016-07-15","16:56:15","20.1","0.02","17.1","1" 1917,"0.349","Pilat","2016-07-15","16:56:25","20.4","0.02","17.0","1" 1918,"0.349","Pilat","2016-07-15","16:56:35","20.7","0.02","17.0","1" 1919,"0.349","Pilat","2016-07-15","16:56:45","21.0","0.02","17.0","1" 1920,"0.349","Pilat","2016-07-15","16:56:55","21.1","0.02","16.9","1" 1921,"0.349","Pilat","2016-07-15","16:57:05","21.3","0.02","17.0","1" 1922,"0.349","Pilat","2016-07-15","16:57:15","21.6","0.02","17.0","1" 1923,"0.354","Pilat","2016-07-15","16:57:25","21.7","1.41","17.0","0" 1924,"0.361","Pilat","2016-07-15","16:57:35","22.0","1.44","17.0","0" 1968,"0.644","Pilat","2016-07-15","17:04:59","48.0","1.49","17.6","0" 1969,"0.650","Pilat","2016-07-15","17:05:09","48.4","1.42","17.6","0" 1970,"0.656","Pilat","2016-07-15","17:05:19","48.7","1.42","17.6","0" 1971,"0.663","Pilat","2016-07-15","17:05:29","49.1","1.42","17.6","0" 1972,"0.664","Pilat","2016-07-15","17:05:39","49.4","0.02","17.7","1" 1973,"0.664","Pilat","2016-07-15","17:05:49","49.7","0.02","17.6","1" 1974,"0.664","Pilat","2016-07-15","17:05:59","49.9","0.02","17.6","1" 1975,"0.664","Pilat","2016-07-15","17:06:09","50.1","0.02","17.5","1" 1976,"0.664","Pilat","2016-07-15","17:06:19","50.2","0.02","17.5","1" 1977,"0.664","Pilat","2016-07-15","17:06:29","50.3","0.02","17.5","1" 1978,"0.664","Pilat","2016-07-15","17:06:40","50.4","0.02","17.5","1" 1979,"0.664","Pilat","2016-07-15","17:06:50","50.5","0.02","17.5","1" |
||
Enko Profil |
#2 · Zasláno: 14. 9. 2016, 13:55:36
Ahoj,
pokud ti jde jen o to zjistit jestli je poslední číslo nula nebo jedna a máš vždy stejný počet hodnot v řádku, tak můžeš použít například funkci explode(); |
||
blaaablaaa Profil |
#3 · Zasláno: 14. 9. 2016, 14:12:05
jtfcobra:
Mozna bude existovat lepsi reseni, ale postupne prochazej data a pokud se zmeni 0 na 1, poznac si, kdy se tak stalo, pokud 1 na 0, spocitej si mezi temi casy rozdil a mas to ... |
||
Tomášeek Profil * |
#4 · Zasláno: 14. 9. 2016, 14:24:40
jtfcobra:
Data jsou odkud? Z databáze? Ze souboru? Z databáze to je snadné, tam si snadno vybereš jen data, která mají na konci nulu a pokud na sebe časy navazují, sečteš je. Pokud v souboru (a tedy poli), pak: - je pole vícerozměrné (tedy, co řádek, to 1. úroveň polí, co hodnota oddělená čárkou, to druhá úroveň polí). Pak by ta hodnota byla v $array[$i][8]
- je jednorozměrné a to, co ukazuješ, je co řádek, to jeden string. Pak hodnotu získáš pomocí substr($row, -2, 1)
Enko: Explode bude zbytečně pomalý v tomto případě, tedy oproti substru, pokud se bavíme o stringu. |
||
Keeehi Profil |
#5 · Zasláno: 14. 9. 2016, 14:39:16
Pokud jsou ty data v souboru vypadají jako csv, tak na jejich čtení bude skvělá funkce fgetcsv
|
||
jtfcobra Profil |
je to v databazi
vubec ted netusim jak to napsat v php ? potrebuji abych vedel ze to bezel treba v 10 pak treba v 13 atd |
||
Tomášeek Profil * |
#7 · Zasláno: 15. 9. 2016, 11:42:33
jtfcobra:
V tom případě si vytáhni jen záznamy, které mají na konci 0 nebo 1, co potřebuješ (to bys snad zvládnout měl). Pak ty záznamy procházej, klasicky while m jako jakákoliv jiná databázová data.
Mohlo by to být nějaký takto, snad tam není nějaká logická chyba, psal jsem to v rychlosti (nechtějí se mi tvořit vzorové struktury dat). $con->query("..."); $i = 0; $intervals = array(); while ($row = $con->fetch_assoc()) { if ($i == 0) { // prvni nastaveni dat $od = $row['od']; $do = $row['od']; } else { if ($row['od'] == strtotime($do . ' + 10 second')) { // pokud na sebe data navazuji, posun hranici 'do' $do = $row['od']; } else { // vznikla mezera, ulozime si do pole $intervals vysledny interval $intervals[] = array($od, $do); // novy zacatek, konec $od = $row['od']; $do = $row['od']; } } $i++; } print_r($intervals); |
||
jtfcobra Profil |
#8 · Zasláno: 15. 9. 2016, 14:23:34
Udelal jsem to takle ale nejfunguje to
Pise to chybu v tomhle radku: $intervals = array(); $db = mysql_connect($hostname_test, $username_test, $password_test); mysql_select_db($database_test,$db); $con = mysql_query("SELECT * FROM d136223_pilat.data where MONTH(datum) = Now() and YEAR(datum) = Now() and DAY(datum) = Now() and zarizeni='Pilat'",$db); $row = mysql_num_rows($con); $i = 0; $intervals = array(); while ($row = $con->fetch_assoc()) { if ($i == 0) { // prvni nastaveni dat $od = $row['od']; $do = $row['od']; } else { if ($row['od'] == strtotime($do . ' + 10 second')) { // pokud na sebe data navazuji, posun hranici 'do' $do = $row['od']; } else { // vznikla mezera, ulozime si do pole $intervals vysledny interval $intervals[] = array($od, $do); // novy zacatek, konec $od = $row['od']; $do = $row['od']; } } $i++; } print_r($intervals); mysql_close($db); |
||
Tomášeek Profil * |
#9 · Zasláno: 15. 9. 2016, 15:07:07
jtfcobra:
Samozřejmě, tohle fungovat nebude a nemůže. Protože... ... protože jednak na ř. 4 máš nesmyslnou proměnnou, která obsahuje jen číslo, počet řádků, který je k ničemu (to je jen logická chyba, nikoliv programová). A druhak, a to zejména, absolutně nechápeš (= zkopíroval jsi bez rozmyslu) řádek 7. Zatímco já jsem použil objektový přístup mysqli, tys ho smotal dohromady s mysql, což samozřejmě fungovat nebude. Už o vlákno vedle jsem napsal, aby sis nastudoval nějaký základ toho, co děláš, jinak to nemá cenu. Do to doby, než na sobě nezačneš pracovat, s nápovědami a radami končím (mimochodem, dal jsem ti prakticky kompletní kód, který nejsi s to zpracovat). |
||
Enko Profil |
#10 · Zasláno: 15. 9. 2016, 21:59:19
Tomášeek:
„Explode bude zbytečně pomalý v tomto případě, tedy oproti substru, pokud se bavíme o stringu.“ Děkuji za reakci. Máš prosím nějaký konkrétní příklad včetně měření časů? O jak moc to bude pomalé? Zajímá mě to, jestli v tom bude nějaký výrazný rozdíl, protože explode() používám celkem často a pokud je nějaké lepší řešení, rád si nechám poradit. |
||
Tomášeek Profil * |
#11 · Zasláno: 16. 9. 2016, 07:38:32
Enko:
Pomalý ve smyslu, že na jedné operaci to samozřejmě nepoznáš, ale globálně bude (dobře, ne pomalý, ale) pomalejší. Časy si snadno změříš sám. Už jen, když si vezmeš, co ty funkce dělají je celkem logické, která bude rychlejší. 1. substr: máš string, najdi x-tý znak, od něj odpočítej dalších pár. Zbytek tě nezajímá. Porovnej. 2. explode: projdi string od začátku do konce, znak po znaku. Porovnej n-tý znak s delimiterem. Naplň pole. Vyber z pole x-tý prvek. Porovnej. |
||
Kcko Profil |
#12 · Zasláno: 16. 9. 2016, 11:26:10
Tomášeek:
V tomhle případě ta zátěž není vůbec vidět, spíš mě děsí dotaz typu where MONTH(datum) = Now() and YEAR(datum) = Now() and DAY(datum) = Now() |
||
Tomášeek Profil * |
#13 · Zasláno: 16. 9. 2016, 11:39:32
Kcko:
Jasně, píšu, že na jedné operaci je to časově nastejno, resp. neměřitelné. Jen jsem chtěl Enka upozornit, že používat explode všude, jak sám uvedl, není best practice. Někde se hodí jiné funkce k dosažení (vizuálně) totožného výsledku. Co se toho SQL dotazu týče, to je kapitola sama pro sebe. K tomu jsem se raději (navíc, jak jsem dříve avizoval) nevyjadřoval. Přiznám se, že z hlavy ani nevím (a teď nemám kde vyzkoušet), jestli je zápis MONTH(datum) = NOW() vůbec validní. Ale na toto odpovídat nemusíš, to bylo jen řečnicky, pak si to někdy vyzkouším.
|
||
Alphard Profil |
#14 · Zasláno: 17. 9. 2016, 10:31:18
Tomášeek [#7]:
Před tímhle přístupem bych varoval, to je podle mě návrhově chybně. Ta idea, že navazující záznamy jsou od sebe 10 s se zřejmě nebude slučovat s realitou. Jestli si pamatuji, co tady jtfcobra dlouhodobě řeší, tak jde o analýzu logů z nějakých měřáků spotřeby. Nesázel bych na to, že tam bude real time operační systém, který fakt odešle data každých 10 s a navíc tam máš síť a server to bude přijímat frontově. Koukni na záznamy: 1913,"0.349","Pilat","2016-07-15","16:55:44","18.6","1.22","17.0","1" 1914,"0.349","Pilat","2016-07-15","16:55:55","19.2","0.02","17.0","1" 1977,"0.664","Pilat","2016-07-15","17:06:29","50.3","0.02","17.5","1" 1978,"0.664","Pilat","2016-07-15","17:06:40","50.4","0.02","17.5","1" Určitě bych kontroloval s předchozím záznamem + by se to mělo vyrovat s chybějícími daty. Spíše pro zajímavost, umím si představit, že by se ta data přímo vytáhla z databáze. Ten dotaz bych stavěl tak, že dám vedle sebe původni sadu dat a data posunutá o jeden řádek a vyberu ty, kde se nerovná sloupec stav. Tady jsem zkoušel takovou hračku sqlfiddle.com/#!9/710b0/1, ale visí to na konstrukci t1.id = t2.id-1 ... Musel bych mít zaručený validní mechanismus, jak se odkázat o jeden řádek zpět.
|
||
Časová prodleva: 8 let
|
0