Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Tekstitiedoston tekstipätkien etsintä

Sivun loppuun

JoonasK [20.03.2007 18:01:08]

#

Jos tekstitiedostossa lukee esim.

Yrityksen nimi
Johtaja: "Matti Järvinen"

Yrityksen nimi (eri yritys)
Johtaja: "Maija Virtanen"

Miten saisin luettua yritysten johtajien nimet (lainausmerkkien välistä) muuttujiin ja laittaa ne TextBoxiin jossa niitä voi muokata, ja Command1:stä painettua tiedot päivittyisivät suoraan tekstitiedostoon?

Selkeä kommentoitu koodi olisi avuksi. Kiitos jo etukäteen. :)

setä [20.03.2007 19:21:32]

#

InStr-funktion avulla. VB-oppaasta saat tarkempaa tietoa jos tarvit.

Quirzo [20.03.2007 19:27:14]

#

data = "Johtaja: 'Matti Järvinen'
'(Käytin eri merkkejä)
data = mid(data,instr(data,"'") + 1)
data = mid(data,1,instr(data,"'") -1)

Ei ehkä täysin oikein, poista + 1 se voi auttaa

JoonasK [20.03.2007 21:34:35]

#

Hyvin toimi Quirzo, mutta merkkien pitäisi olla " eikä '. :/
Ja pitäisi tietää vielä miten löydän kyseisen rivin tekstitiedostosta.

JoonasK [21.03.2007 20:16:23]

#

Ja pitää olettaa ettei tiedetä mitä lukee lainausmerkkien sisällä, eli etsiä rivi ja sitten lukea/kirjoittaa lainausmerkkien sisälle/sisältä.

sqwiik [21.03.2007 20:35:02]

#

Jos lähtötiedoston formaatti on aina tuo sama (nuo kaksi riviä ja niiden jälkeen aina tyhjä rivi), voit lukea kaiken tiedon ohjelmaan ja sitten kirjoittaa (ehkä) muutetun tiedon takaisin.

Kaivanpa tässä pohjattomasta hatustani koodin lukemiseen; kirjoitukseen tarvittavan koodin saat keksiä itse ^_-

Type Tiedot
  YNimi As String
  JNimi As String
End Type


Dim ff As Integer, vali As String
Dim KaikkiTiedot(1 To 200) As Tiedot, Luettu As Integer

  Luettu = 0
  ff = FreeFile
  Open tiedoston_nimi For Input As #ff
  While Not EOF(ff)
    Luettu = Luettu + 1
    Line Input #ff, KaikkiTiedot(Luettu).YNimi
    '' Rivi muotoa: 'Johtaja: "nimi"',
    ''                         ^   ^
    '' eli nimi alkaa kohdasta 11 ja jatkuu Len - 1:een asti.
    Line Input #ff, vali
    KaikkiTiedot(Luettu).JNimi = Mid$(vali, 11, Len(vali) - 1)
    '' Lue vielä tyhjä rivi; sitten jatkuu.
    Line Input #ff, vali
  Wend
  Close #ff

Tuon jälkeen kaikki tarvittava data on tiedossa; tietojen lukumäärä (Luettu), ja tiedot taulukoituna.

JoonasK [21.03.2007 23:00:48]

#

Formaatti ei välttämättä aina ole sama. Joten tämäkin yritys mönkään. :'(

sqwiik [21.03.2007 23:06:19]

#

No, sitten etsitään vaihtoehtoinen ratkaisu. Onko kuitenkin tuo rivi 'Johtaja: "<nimi>"' aina samankaltainen, vaikka sijaitseekin vähän missä sattuu? Ja onko yrityksen nimi aina ko. rivin yläpuolella?

JoonasK [21.03.2007 23:19:32]

#

sqwiik kirjoitti:

No, sitten etsitään vaihtoehtoinen ratkaisu. Onko kuitenkin tuo rivi 'Johtaja: "<nimi>"' aina samankaltainen, vaikka sijaitseekin vähän missä sattuu? Ja onko yrityksen nimi aina ko. rivin yläpuolella?

Kyllä formaatti on aina
Johtaja: "<nimi>"
ja yrityksen nimi on aina rivin yläpuolella. Ajattelitko että etsitään yrityksen nimi (koska se tiedetään etukäteen) ja katsotaan 1 rivi sen alapuolelta ja napataan <nimi> välistä? Se saattaisi toimia.

BadSource [22.03.2007 07:21:02]

#

Tuossa yksi tapa. Alla ei ole mitään sellaista mitä ei olisi löytänyt haulla.

Private Sub EtsiPomot()
    Dim KokoRoska As String
    Dim rivi As String
    Dim splitti() As String
    Dim osat() As String
    Dim pomot() As String

    Open "c:\pomot.txt" For Input As #1
        KokoRoska = Input(LOF(1), #1) 'luetaan muuttujaan koko tiedoston sisältö
    Close #1
    splitti = Split(KokoRoska, vbCrLf) 'taulukoidaan tiedot rivinvaihtojen kohdalta
    ReDim pomot(0) 'alustetaan pomo-taulukko
    For Each rivi In splitti 'käydään splitti-taulukon rivit läpi yksi kerrallaan
        If InStr(1, rivi, Chr(34)) Then 'tarkistetaan sisältääkö kyseinen rivi lainausmerkkiä. chr(34) = "
            osat = Split(rivi, Chr(34)) 'pilkotaan rivi osiin lainausmerkkien kohdalta
            If LenB(pomot(0)) <> 0 Then ReDim Preserve pomot(UBound(pomot) + 1)
            pomot(UBound(pomot)) = osat(1) 'osat(0) sisältää kaiken lainausmerkkiä edeltävän ja osat(2) on tyhjä
            MsgBox "Johtaja " & osat(1) & " lisätty listaan."
        End If
    Next rivi
    If LenB(pomot(0)) <> 0 Then MsgBox UBound(pomot) & " johtajaa löydetty."
End Sub

JoonasK [22.03.2007 16:14:50]

#

BadSource: Muuten hyvä mutta koodi ei toimi eikä tee mitä pyysin. :/
Karkeasti:
Etsitään yrityksen nimi, luetaan rivi sen alapuolelta, otetaan teksti lainausmerkkien sisältä, teksti textboxiin ja sitten nappulaa painamalla katsotaan mitä textboxissa on ja kirjoitetaan se vanha tilalle.

sqwiik [22.03.2007 19:05:25]

#

Jaa-, että pomon nimi etsitään yrityksen nimen perusteella? Silloinhan homma helpottuu huomattavasti.

Tässä etsiminen; saat tämän kautta tietää nimen lisäksi rivin, jolla ko. tieto on.

Dim ff As Integer, nimi As String, rivi as Integer, vali As String

  ff = FreeFile
  Open tiedoston_nimi For Input As #ff
  Do While Not EOF(ff)
    Line Input #ff, vali
    rivi = rivi + 1
    ' Nimi atlteen & pois loopista
    If vali = yrityksen_nimi Then
      nimi = vali
      Exit Loop
    End If
  Loop
  Close #ff

Nyt on tiedossa rivi 'Johtaja "<nimi>"', josta saat edellä mainittuja soveltaen nimen irti.
Sitten vain korvaat uudella tekstillä ('Johtaja "<uusinimi>"') samaisen rivin tiedostosta.

JoonasK [22.03.2007 20:00:41]

#

Hmm laitoin tämän jälkeen:
MsgBox nimi
ja se sanoi yrityksen_nimen Johtajan nimen sijasta. :/

PS. Ja rivikin on sama missä on yrityksen_nimi. :)

sqwiik [22.03.2007 20:09:29]

#

No pyörkele, ajatushärö. Jäi laittamatta jotain välistä ^_-

' if-lause seuraavasti:
If vali = yrityksen_nimi Then
  Line Input #ff, nimi
  rivi = rivi + 1
  Exit Loop
End If

JoonasK [22.03.2007 20:24:03]

#

Exit Loop vaan Exit Do:ksi niin toimii. :)
Kiitos sqwiik!

EDIT: Vielä pitäisi lukea lainausmerkkien sisältä... :(

JoonasK [22.03.2007 21:46:27]

#

Äh selvitin jo.


Sivun alkuun

Vastaus

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

Tietoa sivustosta