Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Tabeilla erotettu teksti ja taulukot

groovyb [07.11.2007 13:24:50]

#

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

neau33 [09.11.2007 13:53:55]

#

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-

neau33 [09.11.2007 23:33:43]

#

EDIT: vaihda...
tämä: Input(1, rivi)
tähän: rivi = (InputString(1, LOF(1)))

neau33 [10.11.2007 14:13:37]

#

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-

groovyb [12.11.2007 22:54:51]

#

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:E65536="K02";IF(Logi!B2:B65536>0.25;IF(Logi!B2:B65536<0.583;Logi!G2:G65536;0);0);0);0)))}

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.

neau33 [13.11.2007 12:22:21]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta