Tiettyjen rivien haku tiedostosta

Ohjelmani pitäisi siis osata hakea jostain tekstitiedostosta esimerkiksi vaikkapa rivi 2 jossa oleva lause voi olla usealla eri rivillä esimerkiksi jos tiedoston sisältö näyttää tältä:

tässä
on tekstiä
*
rivi1
rivi2
rivi3
rivi4
*
abc123

Jos haluan hakea tuosta tiedostosta vaikkapa 2 jutun eli nuo rivi1, rivi2, rivi3 ja rivi4:sen niin kuinka se tehdään?
7750
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

Tarkoititko mahdollisesti jotain tällaista?

Dim sLines As String
Dim sTmp As String

sLines = vbNullString

Open [TIEDOSTOPOLKU] For Input As #1
Do Until EOF(1)
Line Input #1, sTmp
If sTmp Like "rivi*" Then sLines = sLines & sTmp & vbCrLf
Loop
Close #1

Pitäsisi palauttaa:
rivi1
rivi2
rivi3
rivi4

Äänestä

Käytän itse tällaista. Kirjoita tekstitiedosto muotoon

$10
heippa
moro
terve
$20
hei
moi mitä kuuluu?

ja sitten vain haet seuraavalla proseduurilla tekstin

Sub Koe()
x = LueTekstiFile("C:\Testi.txt", "$20", 2)
MsgBox x
End Sub

tämä palauttaa siis moi mitä kuuluu?

Function LueTekstiFile(TekstiFile As String, Dollar As String, Tekstirivi As Long) As Variant

Dim Dollarimerkki As String
Dim Teksti As String
Dim Rivimäärä As Long
Dim Dollariteksti As Boolean
Dim Pituus As Long
Dim Tarkiste As Long
Dim Omatarkiste As Long
Dim Viesti As String

On Error GoTo virhe
Dollarimerkki = "*" & Dollar & "*"
Open TekstiFile For Input As #1
Do While Not EOF(1)
Line Input #1, Teksti
If Teksti Like Dollarimerkki Then
Dollariteksti = True
Rivimäärä = 0
End If

If Dollariteksti = True Then
If Rivimäärä = Tekstirivi Then
Omatarkiste = InStr(1, Teksti, (Chr(39)))
If Omatarkiste > 0 Then
Pituus = Len(Teksti)
Tarkiste = InStr(1, Teksti, (Chr(39)))
If Tarkiste > 0 Then
LueTekstiFile = Mid(Teksti, 1, (Tarkiste - 2))
If LueTekstiFile = "False" Or LueTekstiFile = "True" Then
LueTekstiFile = CBool(LueTekstiFile)
Exit Do
ElseIf IsNumeric(LueTekstiFile) = True Then
LueTekstiFile = CDbl(LueTekstiFile)
Exit Do
Else
LueTekstiFile = CStr(LueTekstiFile)
Exit Do
End If
End If
ElseIf Omatarkiste = 0 Then
LueTekstiFile = Teksti
If LueTekstiFile = "False" Or LueTekstiFile = "True" Then
LueTekstiFile = CBool(LueTekstiFile)
Exit Do
ElseIf IsNumeric(LueTekstiFile) = True Then
LueTekstiFile = CDbl(LueTekstiFile)
Exit Do
Else
LueTekstiFile = CStr(LueTekstiFile)
Exit Do
End If
End If
End If
Rivimäärä = Rivimäärä 1
End If
Loop

Close #1
virhepoistu:
Exit Function
virhe:
Close #1
Viesti = Err.Description & " " & Err.Number
MsgBox Viesti, vbCritical, "Tiedostosta luku"
Resume virhepoistu
End Function

Äänestä
  • ...mutta tuossa on määriteltävä minkä yksittäisen rivin haluan hakea siitä.

    x = LueTekstiFile("C:\Testi.txt", "$20", 2)
    Siis tämähän hakee vain tuon 2 rivin tuosta "$20" kohdasta eli tuon "moi mitä kuuluu?", mutta kuinka saisin siten, että se hakisi ne kaikki muutkin rivit myöskin tuon "hei" sanan riippumatta siitä kuinka monta riviä siinä on aina tekstiä.

    Äänestä

  • minähänse kirjoitti:

    ...mutta tuossa on määriteltävä minkä yksittäisen rivin haluan hakea siitä.

    x = LueTekstiFile("C:\Testi.txt", "$20", 2)
    Siis tämähän hakee vain tuon 2 rivin tuosta "$20" kohdasta eli tuon "moi mitä kuuluu?", mutta kuinka saisin siten, että se hakisi ne kaikki muutkin rivit myöskin tuon "hei" sanan riippumatta siitä kuinka monta riviä siinä on aina tekstiä.

    Tarkoituksesi oli siis lukea *-merkin välissä olevat rivit?

    Dim bStart As Boolean
    Dim sLines As String
    Dim sTmp As String

    bStart = False
    sLines = vbNullString

    Open App.Path & "\test.txt" For Input As #1
    Do Until EOF(1)
    Line Input #1, sTmp

    If Trim$(sTmp) = "*" And Not bStart Then
    bStart = True
    ElseIf Trim$(sTmp) = "*" And bStart Then
    bStart = False
    ElseIf bStart Then
    sLines = sLines & sTmp & vbCrLf
    End If
    Loop
    Close #1

    Tämä koodin pätkä palauttaa *-merkkien välistä kaikki rivit, vaikka niitä olisi useampi.

    Äänestä

  • Orwell kirjoitti:

    Tarkoituksesi oli siis lukea *-merkin välissä olevat rivit?

    Dim bStart As Boolean
    Dim sLines As String
    Dim sTmp As String

    bStart = False
    sLines = vbNullString

    Open App.Path & "\test.txt" For Input As #1
    Do Until EOF(1)
    Line Input #1, sTmp

    If Trim$(sTmp) = "*" And Not bStart Then
    bStart = True
    ElseIf Trim$(sTmp) = "*" And bStart Then
    bStart = False
    ElseIf bStart Then
    sLines = sLines & sTmp & vbCrLf
    End If
    Loop
    Close #1

    Tämä koodin pätkä palauttaa *-merkkien välistä kaikki rivit, vaikka niitä olisi useampi.

    Kyllähän tuo toimii, mutta en hae tuollaista koodia.

    Äänestä

  • minähänse kirjoitti:

    Kyllähän tuo toimii, mutta en hae tuollaista koodia.

    Nyt lukee dollarimerkkien välisen tekstin

    Sub Koe()
    x = LueTekstiFile("C:\Testi.txt", "$20")
    MsgBox x
    End Sub

    Function LueTekstiFile(TekstiFile As String, Alkurivi As String) As Variant

    Dim Dollarimerkki As String
    Dim Teksti As String
    Dim Rivimäärä As Long
    Dim Dollariteksti As Boolean
    Dim Pituus As Long
    Dim Tarkiste As Long
    Dim Omatarkiste As Long
    Dim Viesti As String

    On Error GoTo virhe
    Dollarimerkki = "*" & Alkurivi & "*"
    Open TekstiFile For Input As #1
    Do While Not EOF(1)
    Line Input #1, Teksti
    If Teksti Like Dollarimerkki Then
    Dollariteksti = True
    End If

    If Dollariteksti = True Then
    If Teksti = Alkurivi Then GoTo hyppy
    If Teksti Like "*$*" Then GoTo loppu
    LueTekstiFile = LueTekstiFile & Teksti & vbNewLine
    End If
    hyppy:
    Loop
    loppu:
    Close #1
    virhepoistu:
    Exit Function
    virhe:
    Close #1
    Viesti = Err.Description & " " & Err.Number
    MsgBox Viesti, vbCritical, "Tiedostosta luku"
    Resume virhepoistu
    End Function

    Äänestä

  • Kunde kirjoitti:

    Nyt lukee dollarimerkkien välisen tekstin

    Sub Koe()
    x = LueTekstiFile("C:\Testi.txt", "$20")
    MsgBox x
    End Sub

    Function LueTekstiFile(TekstiFile As String, Alkurivi As String) As Variant

    Dim Dollarimerkki As String
    Dim Teksti As String
    Dim Rivimäärä As Long
    Dim Dollariteksti As Boolean
    Dim Pituus As Long
    Dim Tarkiste As Long
    Dim Omatarkiste As Long
    Dim Viesti As String

    On Error GoTo virhe
    Dollarimerkki = "*" & Alkurivi & "*"
    Open TekstiFile For Input As #1
    Do While Not EOF(1)
    Line Input #1, Teksti
    If Teksti Like Dollarimerkki Then
    Dollariteksti = True
    End If

    If Dollariteksti = True Then
    If Teksti = Alkurivi Then GoTo hyppy
    If Teksti Like "*$*" Then GoTo loppu
    LueTekstiFile = LueTekstiFile & Teksti & vbNewLine
    End If
    hyppy:
    Loop
    loppu:
    Close #1
    virhepoistu:
    Exit Function
    virhe:
    Close #1
    Viesti = Err.Description & " " & Err.Number
    MsgBox Viesti, vbCritical, "Tiedostosta luku"
    Resume virhepoistu
    End Function

    Anteeksi, että vastaukseni kesti näin kauan ja samalla Kiitoksia todella paljon!
    Tämä oli juuri se mitä tarvitsinkin.
    Koodi toimii erinomaisesti.

    Äänestä

Kommentoi aloitusta


minähänse kirjoitti:

Ohjelmani pitäisi siis osata hakea jostain tekstitiedostosta esimerkiksi vaikkapa rivi 2 jossa oleva lause voi olla usealla eri rivillä esimerkiksi jos tiedoston sisältö näyttää tältä:

tässä
on tekstiä
*
rivi1
rivi2
rivi3
rivi4
*
abc123

Jos haluan hakea tuosta tiedostosta vaikkapa 2 jutun eli nuo rivi1, rivi2, rivi3 ja rivi4:sen niin kuinka se tehdään?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu