Moi
Olen "hiukan" hämilläni tekstitiedostojen käsittelystä Visual Basicissa.
Tarkoituksenani olisi käsitellä tekstitiedostoa, jossa on aina yhdella rivillä tietoja(numeerisia ja tekstiä) erotettuna toisistaan pilkuilla. Rivejä kyseisessä tiedostossa on noin 1000. Olen käsitellyt tietomäärää Open Input/Output/Append käskyillä. Joilla olen saanut lisättyä rivejä, poistettua halutun rivin ja muokattua haluttua riviä. Ongelmaksi muodostuu näiden käskyjen käyttäminen kun tiedoston koko suurenee.
Nyt haluaisin oppia käyttämään myös muita tapoja. Olen lukenut FSO:sta ja Open Random käskyistä, mutta en ole mistään löytänyt sellaista esimerkkiä, jonka ymmärtäisin/saisin toimimaan. Jos teillä olisi heittää vinkkiä tästä aiheesta, olisin kiitollinen. Open Random käskyllä pitää käsittääkseni olla määrätyn mittaisia rivejä. Niitä nuo alla olevat eivät ole.
Esimerkki muokattavasta tiedostosta:
190.0,40.5,12,90,10*10,'ensimmäinen'
210.0,30.2,15,45,15*15,'toinen'
345.5,14.8,10,0,10*40,'kolmas'
Terveisin Veikko
FileSystemObject (FSO) on vaihtoehto VB:n perinteiselle tiedostonkäsittelylle, mutta tähän asiaan siitä on tuskin apua.
Jos rivien pituus vaihtelee, niitä ei voi oikein muuten käsitellä kuin peräkkäin yksi kerrallaan. Random-tilassa tiedosto koostuu samankokoisista tietueista, ja tiedoston eri kohtia pystyy käsittelemään nopeasti, kun jokaisen tietueen aloituskohta tunnetaan. Tällöin tiedosto myös muuttuu toisennäköiseksi, jos sitä katsoo tekstieditorilla.
Mitä ongelmia nykyisessä toteutuksessa on tiedoston koon kasvaessa? Jos ohjelmassa nimenomaan täytyy käsitellä tiedoston rivejä sieltä täältä, ohjelmasta tulee toki hidas, jos koko tiedosto käydään joka kerta läpi. Mutta tällöin parempi ratkaisu olisi ladata aluksi koko tiedosto muistiin, muuttaa tietoja halutulla tavalla ja kirjoittaa tiedot vasta lopuksi tiedostoon.
Helpoin tapa käsitellä tuon tyyppistä tekstitiedostoa on lukea tiedosto suoraan tekstiruutuun, käsitellä siinä ja lopuksi tallentaa koko tekstiruutu. Jos tiedosto kasvaa kovin suureksi ja on tarve nopesti päästä käsiksi haluttuun riviin on Random-tiedosto mielestäni sopivin. Luvut voi tallentaa kokonaislukuina (Integer tai Byte) tiiviimmin, tulomuodosta vain luvut ja merkkijonoille on varattava tila pisimmän merkkijonon mukaan. Tällaiseen tiedostoon voi helposti lisätä myös erilaisia hakutoimintoja tarvittaessa.
Antti Laaksonen: "Mitä ongelmia nykyisessä toteutuksessa on tiedoston koon kasvaessa?"
Vastaus: Pomoni sanoi että ei tule toimimaan. Itse olen ohjelmoinut vasta noin 1,5 kuukautta uudessa työpaikassani, joten uskoin hänen sanaansa. Itse olen huomannut, että ongelmia tulee ainakin jos yrittää järjestellä tietoa yhden sarakkeen mukaan perusbubblesortin tapaisella koodilla. kun rivejä on yli 500 mahdollisuus jumiutumiseen kasvaa. Nyt olen ratkaissut olen ongelman käyttämällä aina pienempää osaa päätietokannasta, jolloin järjestelykin toimii. Annan siis päätietokannan olla "sekaisin".
Kiitos sedälle vastauksesta. Onko sinulla tai Laaksosella antaa jokin linkki mistä voisin ottaa mallia tuollaisen random tiedoston tekoon. Visual basicin ohjeita lukiessani en ole saanut hyvää kokonaiskuvaa. Erityisesti se kuinka rivi määritellään on hämärän peitossa.
Kuinka suuri tiedosto voi olla korkeimmillaan? Jos tiedosto ei esim. kasva nykyisestä yli satakertaiseksi eli satatuhatriviseksi, tiedosto kannattaa ilman muuta ladata kokonaan muistiin sopivaan taulukkoon. Tämän jälkeen rivejä voi käsitellä aivan kuin random-tiedostossa. Vain jos tiedosto on niin suuri, että sitä ei voi ladata kokonaan muistiin vaan täytyy käsitellä suoraan tiedostoa, random-tiedostosta on hyötyä.
Kuplalajittelu on hidasta riippumatta tiedoston tallennustavasta. Ratkaisu ei ole tallentaa tiedostoa toisella tavalla vaan muuttaa lajittelutapaa. Nopeampia algoritmeja ovat esim. pikalajittelu (quicksort), kekolajittelu (heapsort) ja lomituslajittelu (mergesort). Näillä voi järjestää todella nopeasti jopa satatuhatrivisen taulukon. Lisätietoa ja valmiita toteutuksia VB:lle voi löytää Googlella.
Nyt tärkeitä kysymyksiä ovat siis, kuinka paljon rivejä voi olla ja mitä niille pitää käytännössä tehdä. Eli pitäisi löytää todellinen syy ohjelman mahdolliseen hitauteen, kuplalajittelu on ainakin yksi syy. Jos et ole paljon ohjelmoinut, sinun on kyllä vaikea ottaa kantaa tällaisiin asioihin. Sanoiko pomosi nimenomaan, että random-tiedosto ratkaisee asian?
Tässä on esimerkki random-tiedoston käytöstä:
Option Explicit ' mitä tietoja tallennetaan Private Type TKirja nimi As String * 30 sivut As Integer hinta As Currency End Type Private Sub Form_Load() Dim kirja As TKirja Open "kirjasto.dat" For Random As #1 Len = Len(kirja) ' tietojen tallennus kirja.nimi = "Näin puhui Zarathustra" kirja.sivut = 120 kirja.hinta = 7.5 Put #1, 1, kirja kirja.nimi = "Antero Vipunen" kirja.sivut = 645 kirja.hinta = 20 Put #1, 2, kirja kirja.nimi = "Vuotuinen ajantieto" kirja.sivut = 207 kirja.hinta = 12.5 Put #1, 3, kirja ' tietojen lataus Get #1, 2, kirja MsgBox "Nimi: " & Trim(kirja.nimi) MsgBox "Sivut: " & kirja.sivut MsgBox "Hinta: " & kirja.hinta Close #1 End Sub
Ohjelmani ei ole vielä valmis. Joten sitä hitautta lähinnä on vasta pystynyt arvailemaan. Tietokanta ohjelmaan saadaan tehtyä vasta myöhemmin ja tietokantaa on tarkoitus pystyä kasvattamaan lisäämällä sinne itse rivejä.
Epäilen kuitenkin erittäin vahvasti, että tietokannasta ei koskaan tule yli 100 000 rivistä, tuskin lähellekään sitä. --> Joten luulen että pomoni on puhunut luulojensa perusteella, eikä todellisen tiedon pohjalta. (Itse luin siitä random-tiedostosta.)
Kiitos vinkeistä noihin tiedoston järjestelyihin. Katsastan ne ja ilmoittelen, jos uusia käänteitä ilmenee.
http://www.vbforums.com/showthread.php?t=473677
Tuossa on hyvä threadi tiedon järjestelyalgoritmeistä VB:llä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.