Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Merkkijonon parserointi Exceliin (VBA)...

Sivun loppuun

mixmaster [18.04.2007 16:29:06]

#

Hei,

Kysymys on helppo mut toteutus idea on nyt hukassa.
Eli minulla on pitkä merkkijono joka on tekstitiedostossa. Nyt pitäisi saada tuo tiedoston sisältö Exceliin VBA makrolla --> Tämä onnistuu jo.

Sitten koska kyseinen merkkijono on nyt yhtenäistä pötköä niin tästä pitäisi saada eri ehdoilla luettua tietoa ja järjesteltävä tämä tieto luettavaan muotoon.

Esimerkki tuosta tiedostosta: QWERT131313131313Y­UIP6786786786Y­UY­UI­Y­UI­Y5456456456TJTJTJTJ jne....

Seuraavanlaisia ehtoja
1) Tietty merkkijono
2) Tietyn mittaisia merkkejä
- Eli tuosta pitäisi pystyä erottelemaan niin että luettava muoto olisi esim.
3) Tiedostossa on aina samat "perustiedot" mutta muuten voi olla vaihteleva määrä esim. noita ARVOJA...

OTSIKKO:
QWERT

ARVO:
131313131313

OTSIKKO2:
YUIP

ARVO:
5456

456456

OTSIKKO3:


Eli tälläinen pähkinä, ei varmaankaan ole vaikea toteuttaa kun hoksaa tuon idean. Omasta koodauksesta on jo aikaa eli tarvitsisin nyt hieman vinkkejä miten kannattaa tehdä.

Tuolla tiedostolla joka pitää olla lukumuodossa ei sinällään ole väliä että mikä sen muoto on, kunhan sitä pystyy lukemaan.

Hurjat kiitokset jo tässä vaiheessa niille jotka jaksavat auttaa...

Grez [18.04.2007 16:41:34]

#

Siis onko tuo otsikko sama asia kuin "perustieto"?

Mitä tarkoitat tietyn mittaisilla merkeillä? M on luonnollisesti leveämpi kuin I ja A korkeampi kuin a, mutta muuten en oikein pysty hahmottamaan käsitettä "merkin mitta". En kuitenkaan usko, että tarkoitit tuota. Ehkä tarkoitit eri pituisia merkkijonoja?

Eli jos oikein arvaan mitä tarkoitat niin siinä tiedostossa on putkessa otsikoita ja arvoja ja arvot jatkuvat aina siihen asti kunnes seuraava otsikko tulee. Ja otsikot voidaan listata, eli ne on ennakkoon tiedossa. Menikö oikein?

Jos meni oikein niin voin tehdä sen ratkaisun, joka on tosiaan aika helppo.

mixmaster [18.04.2007 19:55:55]

#

hmm, nyt en ihan ymmärtänyt kysymystäsi.Mutta kuten kirjoitin eli minulla on tiedosto(tekstitiedosto) jossa on merkkijono esim. QWERT131313131313Y­UIP6786786786Y­UY­UI­Y­UI­Y5456456456TJTJTJTJ

Tuosta merkkijonosta pitäisi pystyä parsimaan luettavaan muotoon tiedot.

Esim.

Oletuksena vaikka että tuo QWERTY olisi otsikko tieto.

Otsikko: QWERT.

Homman nimi oikeassa elämässä on se että toinen ohjelma tuottaa tulosteena tuon merkkijonon. Nyt ongelma vain on se että tuota pelkkää jonoa on vaikea/mahdotonta lukea silmäillen eli se pitäisi saada vain sellaiseen muotoon että siitä saataisiin informaatio ulos.

Spekseissä on tarkkaan määritelty että AINA esim. 4 ekaa merkkiä on tuo QWERT, sitten vaikkapa 13 (alkaa 13. merkistä) merkkijono on YUIP jne.

Annan toki lisää infoa jos tarvis vaati, pääasia että tuohon löytyisi jokin helpohko ratkaisu. Periaatteessahan tuota stringiä pitää vain käydä läpi merkki merkiltä ja nämä sitten siirtää luettavaan muotoon. Voisi ajatella että on olemassa valmis "raportti" johon nuo tiedot pitäisi vain syöttää. Pääasia ei nyt ole se tulosteen ulkomuoto, tärkeintä on että siitä saisi nuo tiedot ulos. Tarkennuksena vielä että tuo merkkijono voi olla esim. 1000 merkkiä pitkä ja siellä toistuvat tietyt merkkijonot.

Grez [18.04.2007 20:42:16]

#

Ei tuossa mitään ongelmaa ole vaikka siinä ei olis tarkkaan speksattu etäisyyksiä. Täytyisi vaan saada vastaus tuohon että oliko tulkintani oikea vai ei.

Mutta taas huomataan että jos ihmiset osaisivat kysyä, niin muut ihmiset pystyisivät vastaamaan. Muutenkin jos ei itsekään osaa yksikäsitteisesti selittää mitä pitäisi saada aikaiseksi, niin ei ole mikään ihme jos se ei onnistu.

mixmaster [19.04.2007 07:43:09]

#

Nyt nolottaa ja pahasti. Eli tämä oli se "oikea" kysymys:

Eli jos oikein arvaan mitä tarkoitat niin siinä tiedostossa on putkessa otsikoita ja arvoja ja arvot jatkuvat aina siihen asti kunnes seuraava otsikko tulee. Ja otsikot voidaan listata, eli ne on ennakkoon tiedossa. Menikö oikein?


JUURI NOIN SE MENEE. En vain tosiaan osannut kysyä asiaa oikein:)

BadSource [19.04.2007 08:29:26]

#

Seuraavassa yksi ratkaisumalli. Kriittistä tässä on se, että otsikot saavat olla ainoastaan kirjaimia ja arvot numeroita, muuten menee reisille.

Dim Taulukko() As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim Merkkijono As String

Merkkijono = "FOO12BAR4566FOO123BAR0980"
ReDim Taulukko(1, 0) 'kaksiulotteinen taulukko
Do Until i >= Len(Merkkijono)
    i = i + 1: j = i + 1
    Do Until IsNumeric(Mid(Merkkijono, j, 1)) 'etsitään otsikon loppu
        j = j + 1
    Loop
    k = j
    Do While IsNumeric(Mid(Merkkijono, k, 1)) 'etsitään arvon loppu
        k = k + 1
    Loop
    If LenB(Taulukko(0, UBound(Taulukko, 2))) > 0 Then 'tarkistetaan taulukon koko
        ReDim Preserve Taulukko(1, UBound(Taulukko, 2) + 1) 'kasvatetaan taulukkoa
    End If
    Taulukko(0, UBound(Taulukko, 2)) = Mid(Merkkijono, i, j - i) 'lisätään arvot taulukkoon viimeisiksi
    Taulukko(1, UBound(Taulukko, 2)) = Mid(Merkkijono, j, k - j)
    Debug.Print Taulukko(0, UBound(Taulukko, 2)) & ": " & Taulukko(1, UBound(Taulukko, 2)) 'esitetään arvot Immediate-ikkunassa
    i = k - 1
Loop

mixmaster [19.04.2007 08:58:53]

#

Hei ja kiitokset vastauksesta. Pitää kokeilla tuolla. Pitää vain ehkä hieman yrittää muuttaa koska otsikossa voi olla tietyssä tilanteessa myös numeroita eli otsikot ei välttämättä aina ole pelkästään kirjaimia.

Mutta tuosta on hyvä lähteä liikkeelle!

Jatkokysymys vielä:
Mites tuon nyt saa viriteltyä tuonne Excelin makroihin.Eli tuleeko tuosta oma funktio jota kutsutaan muualta?

Vai alkuun vain public sub nimi()

Grez [19.04.2007 12:59:17]

#

mixmaster kirjoitti:

Eli jos oikein arvaan mitä tarkoitat niin siinä tiedostossa on putkessa otsikoita ja arvoja ja arvot jatkuvat aina siihen asti kunnes seuraava otsikko tulee. Ja otsikot voidaan listata, eli ne on ennakkoon tiedossa. Menikö oikein?

JUURI NOIN SE MENEE. En vain tosiaan osannut kysyä asiaa oikein:)

No siinä tapauksessahan tämä on perin helppo

(seuraava koodi ei aseta mitään vaatimuksia otsikoissa ja tiedossa käytettäville merkeille)

Sub Paloitteleotsikoittain()
    Dim szRivi As String, szOtsikot() As Variant, szEdelOtsikko As String, lOtsikko As String
    Dim lAlku As Long, lSeuraava As Long, l As Long, i As Long
    szOtsikot = Array("QWERT", "YUIP", "YUYU", "TJTJTJ")
    szRivi = "QWERT131313131313YUIP6786786786YUYUIYUIY5456456456TJTJTJTJ1234567"

    szEdelOtsikko = ""
    lAlku = 1 'Aloitetaan alusta
    Do Until lAlku > Len(szRivi)
        'Jos mitään ei löydy, niin loppuu rivin loppuun
        lSeuraava = Len(szRivi) + 1
        'Käydään otsikot läpi
        For l = 0 To UBound(szOtsikot)
            i = InStr(lAlku, szRivi, szOtsikot(l))
            'Onko seuraava otsikko tämä?
            If i > 0 And i < lSeuraava Then
                lSeuraava = i
                lOtsikko = l
            End If
        Next
        If lSeuraava > lAlku Or szEdelOtsikko <> "" Then
            Debug.Print szEdelOtsikko & ": " & Mid(szRivi, lAlku, lSeuraava - lAlku)
        End If
        'Pois jos loppui
        If lSeuraava > Len(szRivi) Then Exit Do
        'Seuraava otsikko
        szEdelOtsikko = szOtsikot(lOtsikko)
        lAlku = lSeuraava + Len(szEdelOtsikko)
    Loop
End Sub

mixmaster [19.04.2007 15:52:29]

#

No niin, nyt näyttää hyvältä.
Kokeilen tuolla niin saadaan homma pakettiin!

kiitos vielä molemmille


Sivun alkuun

Vastaus

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

Tietoa sivustosta