Elikkä pitäisi pystyä hakemaan merkki tiedostosta kuten rivinumero. Tiedostossa rivit ovas mallia seuraava:
1 | 12.12.1212 | Terve
Mietin myös miten saan kirjattua tiedostoon noita rivejä niin, että joka tulee oma rivinsä vaikka ohjelman olisi sammuttanut. Olen saanut sen toimimaan niin, että ohjelma lisää jokaiselle oman rivinumeron, mutta tämä resetoituu kun ohjelman sammuttaa.
Voisitko vielä hieman selventää kysymyksiäsi?
Miltä näyttää yksi kokonainen tiedosto, mitä siitä pitää tarkalleen hakea ja millaisia voisivat olla siihen tulevat uudet rivit?
2 | 14.12.1212 | moi
1 | 13.12.1212 | terve
0 | 12.12.1212 | hei
Ensimmöinen kysymy:
Tuohon malliin rivit kirjoitetaan kun ohjelma kysyy käyttäjältä ensin päivämäärää ja sitten ns. kommenttia ja kirjaa ne noin, mutta Ensimmäiset numerot kuvastavat rivinumeroa jonka pitäisi auttaa siten rivin löytämistä tiedostosta. Esimerkiksi haluan hakea tiedostosta jotain tiettyä päivämäärää tai kommenttia (vaikkapa: jooh) ohjelma tulostaa msgboxiin: Kommentti: terve löytyi riviltä: 1.
Toinen kysymys:
Kun tiedostoon kirjoitetaan edellä mainittuja rivejä niin ohjelma tulostaa rivin alkuun rivinumeron, ja vaikka ohjelman sammuttaisi ohjelma silti hakisi viiemisimmän rivinumeron ja lisäisi tähä siten yhden luvun lisää ettei saman numeroisia rivejä syntyisi.
(Edellisestä kysymyksestä: Siis saan ohjelman tulostamaan rivinumeron, mutta jos ohjelman sammuttaa se ei muista täten edellistä rivinueroa vaan aloittaa nollasta uudestaan kirjoittamaan rivejä.)
Onko tästä apua:
function haesana(hakusana as string) as string dim rivi as string 'rivin sisältö viedään tähän muuttujaan. dim nonesko as integer 'palauttaa tiedon millä rivillä ollaan. ff = freefile Open "tiedosto.txt" For Input As #ff Do Until EOF(1) Line Input #ff, rivi monesko = monesko + 1 pilkottu = split(rivi, " | ") 'pilkotaan teksti if pilkottu(2) = hakusana then ' 0 = rivinumero, 1 = päivämäärä, 2 = sana haesana = "löytyi riviltä: " & monesko & "." close #ff exit function endif Loop Close #ff haesana = "Ei löytynyt moista. :(" end function
Toisesta kysymyksestä tuli mieleeni, että kun ohjelma kirjoittaa rivejä, niin käytätkö Appendia, vai millä tavoin hoidat kirjoittamisen?
Kirjoitan ihan outputilla jotta saan uusimman rivin aina tallennettua ylimmäksi, mutta nyt jostain syystä tiedostoon tallennus/luominen ei onnistu vaan ohjelma valittaa 'path not found' vaikka tiedosto on olemassa kyseisen polun päässä.
InfreQ kirjoitti:
nyt jostain syystä tiedostoon tallennus/luominen ei onnistu vaan ohjelma valittaa 'path not found' vaikka tiedosto on olemassa kyseisen polun päässä.
Heitäs jotain koodia, niin voitais auttaakki.
Private Sub cmdwrite_Click() 'Määritellään muuttujat Dim teksti As String, avattu As String, lukumaara As String Dim pvm As Date 'Varoitus On Error GoTo virhe 'Avataan tiedosto lukemista varten Open "tiedot\arkisto.omg" For Input As #1 Do While Not EOF(1) Line Input #1, avattu lukumaara = lukumaara + vbNewLine + avattu Loop Close #1 'Kysytään käyttäjältä pvm ja kommentti pvm = InputBox("Syötä koimmentoitava päivämäärä" & vbNewLine & "esim. DD.MM.YYYY") teksti = InputBox("Syötä kommentti") MsgBox ("Asetit päivämäärälle " & pvm & " kommentin " & teksti) 'Avataan tiedosto johon tulostetaan tiedostoon annetut tiedot Open "tiedot\arkisto.omg" For Output As #1 Print #1, rivinro & " | " & pvm & " | "; teksti & lukumaara Close #1 rivinro = rivinro + 1 Exit Sub virhe: MsgBox ("Ohjelma teki valitettavsti virheen tiedostojen puuttuessa. Mikäli et ole luonut tiedostoa, paina 'Luo tiedosto' - nappulaa ja käynnistä ohjelma uudestaan.") End Sub
Koodi voi näyttää kauhealta, mutta itse jotenkin ymmärrän sitä
Kokeiles lisätä app.path ja vielä yksi viiva humalaisena:
Open app.path & "\tiedot\arkisto.omg" For Output As #1
"tiedot\arkisto.omg" -> App.Path & "\tiedot\arkisto.omg"
Olisikohan tuo vikana (en pitkään aikaan ole VB:tä koodannut)?
Kiitos. Tuo auttoi tiedon lisäämiseen.
Notepad ja f3 jos luulen tietäväni mitä sanoit..
Siis koodia hain millä haen miten sen merkin saan haettua, mutta edellisellä tavalla saan tarpeellisen haettua. Vielä kumminkin olisi se rivien lisääminen ettei ohjelman uudelleen käynnistäminen vaikuttaisi siihen.
Rivinumeroa ei aseteta ohjelmassa joten se on aina alussa = 0. Viimeisin rivinumero on kuitenkin tallessa muuttujassa lukumaara heti alussa. Erota se siitä vaikka InStr-funktion avulla ja lisää 1.
Heippa InfreQ!
kokeile tiedoston käsitellyssä seuraavanlaista viritelmää...
'Lomakkeelle: '2 tekstiruutu-objektia ja 3 komentopainike-objektia Private Sub Form_Load() 'asetetaan komentopainikkeiden tekstit Command1.Caption = "Tallenna" Command2.Caption = "Avaa" Command3.Caption = "Etsi" End Sub Private Sub Command1_Click() 'jos tekstiruutu 'Text1' on tyhjä 'asetetaan fokus tekstiruudulle 'Text1', 'annetaan äänimerkki ja poistutaan aliohjelmasta If Text1.Text = "" Then Text1.SetFocus: Beep: Exit Sub End If 'Tyhjennetään tekstiruutu 'Text2' Text2.Text = "" Dim data As String, taulukko() As String, _ apu1() As String, apu2() As String, _ tapaus As Integer, numero As Integer data = "": tapaus = 0: numero = 1 'virhetilanteessa siirrytään seuraavaan tehtävään... On Error Resume Next 'avataan tekstitiedosto lukutilaan... Open App.Path & "\tiedostonimi.ext" For Input As #1 '(.ext = tarkennin) 'jos tapahtui virhe... If Err > 0 Then 'tyhjennetään virheolio ja nollataan virhe... Err.Clear: On Error GoTo 0 'estetään komentopainikkeiden 'Command2 ja Command3 käyttö... Command2.Enabled = False Command3.Enabled = False Else 'luetaan kerralla koko tiedoston sisältö muuttujaan... data = Input$(LOF(1), 1) 'suljetaan tiedosto Close #1 'erotellaan tiedoston rivit taulukkoon... taulukko = Split(Left(data, Len(data) - 1), vbCrLf) 'erotellaan taulukon alimman indeksin alkion 'merkkijono aputaulukkoon (tiedoston ensimmäisen rivin osat)... apu1 = Split(taulukko(LBound(taulukko)), " | ") 'erotellaan taulukon ylimmän indeksin alkion 'merkkijono aputaulukkoon (tiedoston viimeisen rivin osat)... apu2 = Split(taulukko(UBound(taulukko)), " | ") 'mikäli haluat käyttää sellaista tapaa, että... Select Case Val(Trim(apu1(LBound(apu1)))) 'viimeksi lisätty tieto on tiedoston viimeinen rivi Case Is < Val(Trim(apu2(LBound(apu2)))) tapaus = 0: numero = Val(Trim(apu2(LBound(apu2)))) + 1 'viimeksi lisätty tieto on tiedoston ensimmäinen rivi Case Is > Val(Trim(apu2(LBound(apu2)))) tapaus = 1: numero = Val(Trim(apu1(LBound(apu1)))) + 1 'mikäli tiedostossa on vain yksi rivi Case Is = Val(Trim(apu2(LBound(apu2)))) 'viesti-ikkuna ilmestyy näkyviin... msg& = MsgBox("Lisätäänkö rivit tiedoston alkuun", _ vbQuestion + vbYesNo, App.Title) Select Case msg& 'jos vastataan 'Kyllä' Case 6 tapaus = 1: numero = 2 'jos vastataan 'EI' Case 7 tapaus = 0: numero = 2 End Select End Select End If 'avataan tekstitiedosto "kirjoitustilaan" '(itseasiassa luodaan tiedosto jonka sisältö on 'tyhjä merkkijono ""... jos samassa kansiossa on 'jo samanniminen tiedosto se tuhotaan ja tilalle 'luodaan uusi "tyhjä" tiedosto samalla nimellä) Open App.Path & "\tiedostonimi.ext" For Output As #1 'mikäli Select Case tapaus 'jos tapaus on... Case 0 'lisätään merkkijonomuuttujan 'data' tekstisisältöön 'muuttujan numero' tekstiksi muutetun arvon, merkkijonon '" | ", 'päivämäärän, merkkijonon " | " ja tekstiruudun 'Text1' tekstin yhdistelmästä 'muodostuva merkkijono... data = data & CStr(numero) _ & " | " & Format$(Date, "dd.mm.yyyy") _ & " | " & Text1.Text 'jos tapaus on... Case 1 'korvataan merkkijonomuuttujan 'data' 'tekstisisältö muuttujan 'numero' tekstiksi muutetun 'arvon, merkkijonon " | ", päivämäärän, merkkijonon '" | ", tekstiruudun Text1' tekstin', rivinvaihto- 'merkkien, sekä muuttujan 'data' tekstisisällön 'yhdistelmästä muodostuvalla merkkijonolla.... data = CStr(numero) & " | " & _ Format$(Date, "dd.mm.yyyy") & " | " & _ Text1.Text & vbCrLf & data End Select 'kirjoitetaan muuttujan 'data' tekstisisältö 'tiedostoon ja suljetaan avoin tiedosto... Print #1, data: Close #1 'tyhjennetään tekstiruutu 'Text1' Text1.Text = "" 'jos komentopainikkeen Command2 käyttö 'on estetty sallitaan painikkeen käyttö... Command2.Enabled = True End Sub Private Sub Command2_Click() 'virhetilanteessa siirrytään seuraavaan tehtävään... On Error Resume Next 'avataan tekstitiedosto lukutilaan... Open App.Path & "\tiedostonimi.ext" For Input As #1 'jos tapahtui virhe... If Err > 0 Then 'tyhjennetään virheolio ja nollataan virhe... Err.Clear: On Error GoTo 0 'estetään komentopainikkeiden 'Command2' ja ’Command3’ käyttö... Command2.Enabled = False Command3.Enabled = False 'ilmoitetaan viesti-ikkunassa, että... MsgBox "Tiedostoa ei ole", vbExclamation, App.Title 'ja asetetaan fokus tekstiruudulle 'Text1' Text1.SetFocus 'muutoin... Else 'luetaan koko tiedosto kerralla tekstiruutu 'Text2' tekstiksi ja suljetaan tiedosto Text2.Text = Input$(LOF(1), 1): Close #1 End If End Sub Private Sub Command3_Click() If Text1.Text = "" Then Text1.SetFocus: Beep: Exit Sub End If 'alustetaan kaksi yhden alkion taulukkomuuttujaa Dim data(0) As String, laskuri(0) As Integer On Error Resume Next Open App.Path & "\tiedostonimi.ext" For Input As #1 If Err > 0 Then Command2.Enabled = False Command3.Enabled = False MsgBox Error$, vbExclamation, App.Title Err.Clear: On Error GoTo 0: Exit Sub Else Text2.Text = "" Do While Not EOF(1) Input #1, data(0) 'tutkitaan InStr-funktion avulla taulukkomuuttujan 'data ainoaan alkioon (0) luetun tiedoston rivin merkkijono If InStr(data(0), Text1.Text) > 0 Then 'ja jos merkkijonon sisältä löytyy tekstiruudun 'Text1' 'tekstiä vastaavaa merkkijono kasvatetaan taulukkomuuttujan 'laskuri' ainoan alkion (0) arvoa yhdellä... laskuri(0) = laskuri(0) + 1 'lisätään tekstiruutu 'Text2' tekstisisältöön merkkijonosta '"Rivi ", tekstiksi muunnetun taulukkomuuttujan 'laskuri' 'alkion arvosta, taulukkomuuttujan data alkion merkkijonosta 'ja rivinvaihtomerkeistä muodostuva merkkijono... Text2.Text = Text2.Text & "Rivi " & CStr(laskuri(0)) _ & " data:" & data(0) & vbCrLf 'ilmoitetaan etsinnän tuloksesta viesti-ikkunassa 'ja asetetaan vaihtoehdoiksi etsinnän jatkaminen/ 'keskeyttäminen... msg& = MsgBox(CStr(laskuri(0)) & ". hakuehtoa vastaava tieto " _ & vbCrLf & " löytyi Jatketaanko etsintää", _ vbQuestion + vbYesNo, App.Title) Select Case msg& Case 7 'Jos valitaan 'Ei' suljetaan tiedosto, 'pyyhitään taulukot pois muistista 'ja poistutaan aliohjelmasta... Close #1: Erase data, laskuri: Exit Sub End Select End If Loop 'suljetaan tiedosto ja pyyhitään taulukot pois muistista Close #1: Erase data, laskuri End If End Sub
Kiitos, tuo oli täläiselle aloittelijallekkin todella valaisevaa. Kiitän myös suuresti kaikkia muita avustaneita, nyt sekin ongelma on ratkennut. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.