Tervehdys!
Pulma on tällainen:
Laite tuottaa logitiedostoa tab erotetussa muodossa näin:
(päivämäärä) (aika) C0X M0X K0X C0X 0 0
X = numerosarja
lopussa olevat 0:t muuttuvat, ensimmäinen numero on korjaukseen ja seuraava
hylätyt kappaleet.
tässa logissa on noin 60000 riviä, ja koko ajan tulee lisää. noin 100 rivin päivävauhtia.
nyt tarvitsisi tuo teksti saada imettyä arrayhin siten että saisin haulla aikaan
esim:
jos päivämäärä tämä, K0X on tämä, niin laske kaikki ensimmäiset lukemat.
accessia tai muuta tietokantaa en voi käyttää koska verkko ei mahdollista yhteistä tietokantaa tietoturvasyistä.
login saan imettyä verkon kautta suoraan ohjelmaan, se puoli on jo hoidossa.Mutta sen ajaminen arrayhin ja hakujen toimittaminen.
aiemmin käytin exceliä macroilla mutta tuo 65k rivin maksimi tulee kohta täyteen ja sen käyttö ei ole täten enää mahdollista.
elikkäs joku moniulotteinen dynaaminen array tarvitsisi muodostaa importtaamalla se file sinne, ja varmaan parsettaa teksti jotta haku mahdollistuisi,sekä itse haku teettää jollain do loopilla tai for nextillä.
vb.net on käytössä (VB2005)
-Groovyb
Moikka groovyb!
Tarviiks ne login kaikki rivit välttämättä pukata johonkin?
mikäli ei niin hae vain tarvittavat rivit oheisen mallin suuntaisella viritelmällä Exceliin ja hoitele se laskenta sillä valmiilla makrollasi...[/k]
formille nappi ja pari tekstiboxia (hakua varten) ja sit...
'... Imports System.IO '... Imports Microsoft.VisualBasic '... 'valmiiks generoitu paska... '... '... Private Sub Button1Click(sender As System.Object, e As System.EventArgs) Dim koodattu As string 'tähän väliin viritelmä, jolla koodaat tekstiboxin 'sisältämän esim. päivämäärän muotoon 'C0X' tms. '... '*koodattu = ... 'mikäli sattuisi olemaan niin, että logisi olisi 'pelkkää putkea ilman rivinvaihtoja niin asia 'voidaan tsekata vaikkapa seuraavasti... Dim rivi As String, i As Long FileSystem.FileOpen(1, Environ("userprofile") _ + "\Työpöytä\logi.log", OpenMode.Input) Input(1, rivi) Seek(1,1) FileClose(1) Dim ix As long = rivi.IndexOf(vbCrLf) If ix = -1 Then Dim TABit As Long, TabCnt As Long 'tähän arvoksi tulee esim. TABit = 4 'tai vaikkapa CLng(textBox2.Text) tabCnt = 0 For i = 0 To rivi.Length -1 If rivi.Substring(i, 1) = vbTab Then TabCnt = TabCnt + 1 If TabCnt Mod TABit = 0 And i > 0 Then 'korvataan määritelty TAB rivinvaihdolla rivi = rivi.Substring(0, i) + _ Environment.NewLine + _ rivi.Substring(i + 1, rivi.Length - i -1) End If End If Next FileSystem.FileOpen(1, Environ("userprofile") _ + "\Työpöytä\logi.log", OpenMode.Output) Print(1, rivi) FileClose(1) End If Dim reader As New StreamReader(Environ("userprofile") _ + "\Työpöytä\logi.log") Dim writer As New StreamWriter(Environ("userprofile") _ + "\Työpöytä\logi.csv") rivi = reader.ReadLine() While rivi <> "" If rivi.IndexOf(koodattu) > -1 Then '*koodaus writer.WriteLine(Replace(rivi, vbTab, ";")) End If rivi = reader.ReadLine() End while reader.Close() writer.Close() Dim basePolku As String = _ "C:\Program files\Microsoft office\" Dim xlPolku As String For i = 10 To 12 xlPolku = ("Office" + i.ToString + "\Excel.exe") If File.Exists(basePolku + xlPolku) Then xlPolku = basePolku + xlPolku Exit for End If Next Dim kokoJutska As String = xlPolku + " " _ + chr(34) + Environ("userprofile") _ + "\Työpöytä\logi.csv" + chr(34) Dim csvAvaa As Integer = Shell(kokoJutska, _ AppWinStyle.MaximizedFocus) End Sub
-Nea-
EDIT: vaihda...
tämä: Input(1, rivi)
tähän: rivi = (InputString(1, LOF(1)))
Moikka taas groovyb!
tässä hieman paranneltu versio...erona edelliseen on, että mikäli logi on suoraa putkea ei silti lueta, kuin osa datasta kerrallaan muuttujaan, jolloin dataa saa olla aikas paljon...
toimivuudesta huolimatta päätyisin kuitenkin ehkä pukkaamaan jutskan vielä xml:ksi mikä antasi lisää käyttömahdollisuuksia...
'... Imports System.IO '... Imports Microsoft.VisualBasic '... 'valmiiksi generoitu paska... '... Private Sub Button1Click(sender As System.Object, e As System.EventArgs) '** tähän alkuun viritelmä, jolla koodaat tekstiboxin 'sisältämän esim. päivämäärän muotoon 'C0X' tms. 'Dim koodattu As string '... '... 'koodattu = ... FileSystem.FileOpen(1, Environ("userprofile") _ + "\Työpöytä\logi.log", OpenMode.Input) Dim i As Integer, rivi as String Dim recLen As Long, idx As Long recLen = 50 'tähän arvoksi 'COX......0 0' stringin max-pituus Seek(1, 2) idx = InputString(1, recLen).IndexOf(vbCrLf) Select Case idx Case -1 Dim TabCnt As Long, TABit As Long, tagCnt As Long Dim tmpStr As String, tagLen As Long FileSystem.FileOpen(2, Environ("userprofile") _ + "\Työpöytä\logi.csv", OpenMode.Output) 'TABit = TAB-merkit 'COX......0 0' stringissä + 1 TABit = 4: tabCnt = 0: tagCnt = 0: tmpStr = "" Do While Not EOF(1) i += 1: Seek(1, i) tmpStr = (InputString(1, 1)) If tmpStr = vbTab Then TabCnt += 1 If TabCnt > 0 And TabCnt Mod TABit = 0 And TabCnt <> tagCnt Then Seek(1, 1 + tagLen) rivi = (InputString(1, i - tagLen - 1)) + vbCrLf tagLen = i : tagCnt = TabCnt rivi = Replace(rivi,vbTab, ";") '** TextBox1.Text tilalle koodattu arvo if rivi.IndexOf(TextBox1.Text) > -1 Then Print(2, rivi) End If Loop FileClose(1) FileClose(2) Case Is > -1 FileClose(1) Dim reader As New StreamReader(Environ("userprofile") _ + "\Työpöytä\logi.log") Dim writer As New StreamWriter(Environ("userprofile") _ + "\Työpöytä\logi.csv") rivi = reader.ReadLine() While rivi <> "" '** TextBox1.Text tilalle koodattu arvo If rivi.IndexOf(textBox1.Text) > -1 Then writer.WriteLine(Replace(rivi, vbTab, ";")) End If rivi = reader.ReadLine() End while reader.Close() writer.Close() End Select Dim basePolku As String = _ "C:\Program files\Microsoft office\" Dim xlPolku As String, xlExists As Boolean For i = 10 To 15 xlPolku = ("Office" + i.ToString + "\Excel.exe") If File.Exists(basePolku + xlPolku) Then xlPolku = basePolku + xlPolku xlExists = True: Exit for End If Next If xlExists = True Then Dim kokoJutska As String = xlPolku + " " _ + chr(34) + Environ("userprofile") _ + "\Työpöytä\logi.csv" + chr(34) Dim csvAvaa As Integer = Shell(kokoJutska, _ AppWinStyle.MaximizedFocus) End If End Sub
-Nea-
Thx!
en ehdi nyt heti kokeilemaan, kokeilen loppuviikolla.
tarkoitus on kerätä dataa täten:
esim1.
kaikki rivit joiden päivämäärä on nykyinen päivä, ja viimeinen arvo lasketaan yhteen.
ja koska viimeinen luku on romut, täten saadaan tämän päivän romulukema.
esim2.
kaikki hylätyt aikajaksolta 1.4 - 30.10
eli jos date on tällä aikavälillä niin lasketaan toisiksi viimeiset arvot yhteen.
esim3.
yövuoron kappalemäärä:
jos aikaväli on 10.11.2007 klo 22.00 - 11.11.2007 klo 05.59
niin lasketaan rivit joissa on paletti on käynyt a, b tai c asemassa, eli joissa on joko K01, K02, tai K03 arvo rivin viidennessä kolumnissa. ja kerrotaan lopputulos 16:sta, koska paletilla on 16 kpl (eli keräys tapahtuu siten että jokaisessa asemassa on saattomuistinlukija, ja paletissa saattomuisti. pääteasemassa luetaan missä se on ollut ja mihin aikaan saapunut tarkastuspisteelle)
-----
tällaisia laskutoimituksia.
noiden pitkien aikavälien laskujen takia tulee kyllä aika monta riviä, kymmeniä tuhansia.
excel tuottaa kyllä ongelmia, koska täällä on käytössä excel 97:sta xp exceliin ja ne macrot ei ole yhteensopivia keskenään. siitä olen joutunut tappelemaan tähänkin asti kun porukka on rampannu eri koneille et on saanu tilastoja katsottua :D, nyt on jo ihan pakko tehdä se erikeinoin :(
Tähän asti olen joutunut käyttämään macroja niin vähän kuin mahdollista, ainoastaan yksi on käytössä, päivitysnappi jonka takana on vain activeworkbook.refreshall ja sekään ei toimi 97 excelissä.
laskut jouduin tekemään tähän tyyliin:
{=SUM((IF(Logi!A2:A65536=TODAY();IF(Logi!E2:
vihaan muutenkin tehdä excelillä lausekkeita joissa IF käskyt on SUM:n tai muiden laskevien funktioiden alapuolella, törkeän hitaita laskuja ja hitaita vääntää.
mikä sitte lie lausekkeen oikea nimitys kun pitää ctrl + shift + enterillä vetää nuo {} merkit lausekkeeseen jotta saa toimimaan if käskyt laskufunktioiden alaisuudessa.
Tuossa laskussa lasketaan montako palettia on aamuvuorossa tullut A.yksiköstä, eli tuo K02
tässä pätkä logia:
01.01 22:29 17 MR00 K00 C00 00 00
01.01 22:33 19 MR03 K00 C01 00 00
01.01 22:54 16 MR03 K00 C01 00 00
01.01 22:54 11 MR02 K00 C01 00 00
01.01 23:12 08 MR01 K00 C01 00 00
01.01 23:52 16 MR00 K03 C01 06 00
01.01 23:52 28 MR02 K02 C01 01 00
01.02 00:15 05 MR00 K01 C01 07 00
01.02 00:15 01 MR03 K00 C01 00 00
01.02 00:43 24 MR01 K03 C01 16 00
01.02 00:51 20 MR02 K02 C01 03 00
01.02 00:55 06 MR03 K00 C01 00 00
01.02 01:14 07 MR01 K01 C01 09 00
01.02 01:19 25 MR01 K00 C01 00 00
01.02 01:33 21 MR01 K02 C01 02 00
01.02 01:42 26 MR02 K03 C01 07 00
01.02 01:42 19 MR01 K00 C01 00 00
01.02 02:00 22 MR02 K01 C01 05 01
01.02 02:13 08 MR03 K00 C01 00 00
01.02 02:27 10 MR03 K02 C01 03 00
01.02 02:34 17 MR02 K03 C01 01 00
01.02 02:51 28 MR01 K01 C01 02 00
01.02 03:14 16 MR02 K02 C01 00 00
01.02 03:33 24 MR03 K00 C01 00 00
01.02 03:33 06 MR01 K00 C00 00 00
01.02 03:33 01 MR01 K03 C01 00 00
ei näemmä näytä oikein noita välejä, perhana.
no muutenkin logissa ei ole joka välissä tab erotusta näemmä, se on mrXX:stä lähtien.
päivän, kellonajan, paletin numeron ja mrXX:n välissä on epätasaista väliä.
itse loggaussofta on tehty vb6:sella, ja siitä ei ole koodeja nähtävillä jotta näkisin miten nuo välit on määritetty.
Moikka taas groovyb!
sillä ei ole väliä mitä erkkien väliin jää, kunhan erkki löytyy (sälä on poistettavissa helposti replacella tahi removella)
tutki se erottelu vaikkapa tähän tapaan...
'... Imports Microsoft.VisualBasic '... Private Sub Button1Click(sender As System.Object, e As System.EventArgs) Dim erkit As string = "erkit: " '.... 'lue tässä rivi/t logista vaikkapa StreamReaderilla Dim rivi as string = "01.01 22:29 17 MR00 K00 C00 00 00" Dim i As Integer For i = 0 To rivi.Length - 1 Select case asc(rivi.Substring(i, 1)) Case 10, 13, 33 to 127 Case else If erkit.indexOf(asc(rivi.Substring(i, 1)).ToString) = -1 Then erkit += asc(rivi.Substring(i, 1)).ToString + " " End if End Select Next '.... messagebox.Show(erkit) End Sub
Aihe on jo aika vanha, joten et voi enää vastata siihen.