Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET ja tekstitiedoston luku

Sivun loppuun

Jokkeri [27.01.2006 11:23:32]

#

Pystyykö tekstitiedostossa siirtymään mitenkään suoraan tietyn määrän rivejä eteenpäin (esim. hypätä suoraan 50000 riviä eteenpäin)? Vai onko ainut mahdollisuus mennä rivi kerrrallaan?

Dim srHaku As StreamReader = New StreamReader("tuote.txt", System.Text.Encoding.GetEncoding(1252))
Dim strRivi As String

Do
  strRivi = srTuotteet.ReadLine()

  'if ehtomääritys tähän väliin

Loop Until strRivi Is Nothing

T.M. [27.01.2006 12:10:29]

#

Rivi kerrallaan on aina pakko mennä, koska ei se voi laskea sitä missä kohdassa se 50000. rivi on, jos rivit ovat eripituisia.
Kannattaa laittaa rivit samanpituisiksi, niin sen lukeminen nopeutuu huomattavasti.

LaNu [29.01.2006 16:42:19]

#

Olisikohan niitä "turhia rivejä" mahdollista skipata jotenkin: tarkoitan niiden läpikäymisen nopeuttamista, jos on tiedossa oikean rivin numero.

Eipä taida onnistua... ehkäpä if lause jolla vain se oikea rivi syötetään muuttujaan? Ei kyllä aavistustakaan nopeuttaako se.

Metabolix [29.01.2006 18:32:40]

#

Luet turhat rivit For-silmukalla laittamatta niitä muuttujaan, kai VB:ssäkin voi niin tehdä?

setä [29.01.2006 21:44:52]

#

En ole VB.NETtiä käyttänyt, mutta jos tekstitiedoston sijaan käytät Random-tiedostoa, jossa kukin rivi vastaa tietuetta, voit osoittaa suoraan mitä tahansa riviä. Tietuen pituudeksi on tietysti valittava rivin maksimipituus.

Jokkeri [30.01.2006 12:29:01]

#

Ohjelma tulisi käytettäväksi kämmentietokoneessa ja VB.NET Random-tiedostoa ei tueta pda laitteessa. Onko mitään muita vaihtoehtoja saada edes jonkinlainen tietokanta kämmenkoneeseen?

Meitsi [30.01.2006 16:08:36]

#

Kyllä ainakin tämän sivun mukaan on mahdollista siirtyä tiettyyn kohtaan:
http://www.startvbdotnet.com/files/default.aspx

lainaus:

Imports System.IO
'NameSpace required to be imported to work with files
Public Class Form1 Inherits System.Windows.Forms.Form
Private Sub Button1_Click(ByVal....., Byval.....)Handles Button1.Click
Dim fs as New FileStream("file.doc", FileMode.Create, FileAccess.Write)
'declaring a FileStream and creating a document file named file with
'access mode of writing
Dim s as new StreamWriter(fs)
'creating a new StreamWriter and passing the filestream object fs as argument
s.WriteLine("This is an example of using file handling concepts in VB .NET.")
s.WriteLine("This concept is interesting.")
'writing text to the newly created file
s.Close()
'closing the file

fs=New FileStream("file.doc",FileMode.Open,FileAccess.Read)
'declaring a FileStream to open the file named file.doc with access mode of reading
Dim d as new StreamReader(fs)
'creating a new StreamReader and passing the filestream object fs as argument
d.BaseStream.Seek(0,SeekOrigin.Begin)
'Seek method is used to move the cursor to different positions in a file, in this code, to
'the beginning
while d.peek()>-1
'peek method of StreamReader object tells how much more data is left in the file
RichTextbox1.Text &= d.readLine()
'displaying text from doc file in the RichTextBox
End while
d.close()
End Sub

tuolla baseStream.seek:illä ilmeisesti pystyisi siirtymään eri kohtaan.

Blaze [30.01.2006 17:36:18]

#

Meitsi kirjoitti:

tuolla baseStream.seek:illä ilmeisesti pystyisi siirtymään eri kohtaan.

Joo, mutta edelleen joutuu selvittämään ne rivien alkamiskohdat jotenkin.

Tuossa PHP-flatfile -tietokantavirityksessä, jota oon suunnitellu, oon kirjottanu merkkijonon pituuden aina sen alkuun, joten jos kyseessä ei oo merkkijono, jonka haluan lukea, fseekaan vaan sen yli ja toivon mukaan säästän koneelta aikaa.

Metabolix [30.01.2006 18:07:03]

#

Jos vaikka tallentaa tiedoston alkuun joka sadannen rivin sijainnin ja seekkaa niistä lähimpään?

Jokkeri [02.02.2006 21:02:24]

#

Tuo baseStream.seek toimii niin kuin pitääkin. Tekstitiedoston rivien mitta on jokaisella rivillä sama joten oli helppo hyppiä esim. 500 riviä eteenpäin ja tarkistaa oliko hyväksytty rivi siellä välillä. Nyt vaikka tietyn rivin haku 50.000 tekstirivin joukosta löytyy noin sekunnissa, kun se StreamReader menetälmällä kesti melkein minuutin! Kiitos!


Sivun alkuun

Vastaus

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

Tietoa sivustosta