Eli luen tietoja tauluun tiedostosta.
Nyt ongelmana on se, tiedostossa on rivien välissä useampia
välilyöntejä, joten tämä tarkistus ei pelaa:
If TekstiRivi = "" Then Exit Do
Eli olisiko jotain funktiota tms. joka tarkistaisi paremmin, että onko tiedosto tosiaan luettu kokonaan loppuun ?
Työkaluna: MS Visual Basic 2005 Express Edition
EDIT: eli ei ole mistään tietokantataulusta kyse, vaan taulu on määritelty näin:
Dim Table As New ArrayList
EOF(#F) = True kun tiedosto #F on luettu loppuun (Ainakin VB:ssä, eiköhän tuossakin)
Kiitos. Nyt vain ihmetyttää, että missä voin määritellä, että tiedosto olisi vaikka 1
Ohjeissa oli esimerkki:
FileOpen(1, "TESTFILE", OpenMode.Input) Do While Not EOF(1)
Mutta olen jo aikaisemmin määritellyt, että tiedosto on auki jne..
Dim fs As New FileStream("C:\kansio\tiedosto.txt", FileMode.Open, FileAccess.Read)
Joten miten saisin määriteltyä, että voisin laittaa näin näin: EOF(1)
Jos tossa Expressissä toimii, käytä avaukseen Open-käskyä:
Open "C:\kansio\tiedosto.txt" For Input As 1
Edit. Tai siis avaa se tuolla ohjeen esimerkillä.
FileStream-luokassa ei ole EOF-metodia, mutta korvikkeeksi löytyy purukumia:
If fs.Length = fs.Position Then ' Loppu tuli. End If
Length on siis tiedoston pituus, ja Position on sijainti sillä hetkellä. Jos sijainti on sama kuin tiedoston pituus, ollaan tietenkin lopussa.
Olen "hiukan" käsi ohjelmoinnissa, mutta kokeilin tällätavalla rakentaa looppia, mutta nyt looppiin ei mennä ollenkaan, vaan saan heti tekstin: poistuttiin loopista ?
Do While fs.Length = fs.Position Dim RiviTekstia As String RiviTekstia = sr.ReadLine Table.Add(RiviTekstia) MsgBox("Päästiinko looppiin?") Loop MsgBox("Poistuttiin loopista") sr.Close()
Looppaat nyn niin kauan kuin ollaan tiedoston lopussa. Eli yhtäsuuruusmerkki erisuuruusmerkiksi tai pienempi-kuin-merkiksi, niin sitten toimii.
Sisennyksiäkin voisi hieman harjoitella. Luulin ensi silmäyksellä, että tuosta puuttuu silmukan loppuosa, kun ei sisennys ollut kohdallaan. Ja VB:lle on aivan omakin kooditagi nimeltään vbkoodi, suosittelen.
No ei nyt ihan vielä toiminut?.
Vähän ihmetyttää, kun käytän ascii tiedostoa (yli 6000 riviä), niin silloin toimii paremmin, vaikka silloinkin jää n. 20 riviä loppupäästä puuttumaan, mutta nyt kun testaan 10 rivisellä tiedostolla (tiedosto.txt), niin ainoastaan ensimmäinen rivi luetaan taulukkoon:
Dim fs As New FileStream("C:\kansio\tiedosto.txt", FileMode.Open, FileAccess.Read) Dim sr As New StreamReader(fs) Dim Table As New ArrayList Dim RiviTekstia As String Dim Taulunkoko As Integer Do While fs.Length <> fs.Position RiviTekstia = sr.ReadLine MsgBox("" & RiviTekstia) Table.Add(RiviTekstia) Loop sr.Close() Taulunkoko = Table.Count MsgBox("Taulun koko:" & Taulunkoko)
StreamReader todennäköisesti lukee valmiiksi muistiin jotain, jolloin tiedosto loppuu jo ennen kuin kaikki on saatu StreamReaderista ulos.
Jos olisit jaksanut Googleen kirjoittaa StreamReader, olisit löytänyt MSDN:stä esimerkin, josta löytyy hyvin yksinkertainen tapa:
Do Rivi = sr.ReadLine() Table.Add(Rivi) Loop Until Rivi Is Nothing
Käyttelen VB:tä melkeinpä ensimmäistä kertaa, joten olen aika pihalla vielä.
Mutta nyt toimii, kiitos paljon!.
Aihe on jo aika vanha, joten et voi enää vastata siihen.