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: QWERT131313131313YUIP6786786786YUYUIYUIY5456456456TJTJTJTJ 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...
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.
hmm, nyt en ihan ymmärtänyt kysymystäsi.Mutta kuten kirjoitin eli minulla on tiedosto(tekstitiedosto) jossa on merkkijono esim. QWERT131313131313YUIP6786786786YUYUIYUIY5456456456TJTJTJTJ
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.
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.
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:)
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
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()
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
No niin, nyt näyttää hyvältä.
Kokeilen tuolla niin saadaan homma pakettiin!
kiitos vielä molemmille
Aihe on jo aika vanha, joten et voi enää vastata siihen.