Hei
Minun pitäisi lukea .csv tiedosto ohjelmaan käsiteltäväksi ja erilaisia laskutoimituksia varten. Millainen olisi parempi tapa(kuin alla) lukea tiedosto. Alla oleva olisi jotenkin tarjoitus laittaa johonkin omaan structureen... esim public Tiedot(1000) as Struc_Tiedot tyyliin...
Laitan alla tietoja ensin info.text kenttään, jotta näen että pilkkoo oikein.
Olisiko fiksumpaa tapaa? Tuossa kans ongelmana kun Haku -muuttujan hakema tieto vaihtelee, välillä on vain tekstiä ja välillä useampia tekstejä ja niiden välillä 1:stä 6:een TABIA.
Niin jas jättää lukematt Haku :n ensimmäisen ja viimeisen arvon jos välillä useita tabeja?
Aargh!
Jaksaisiko/ehtisikö joku vähän ohjata korjauksessa tai toisella tavalla tekemisessä?
info.Text = "" Dim loppu As String = "" Dim merkki As String = "" Dim siirto As String = "" Dim pituus As Integer = 0 Dim onpilkottu As Boolean = False Dim haku As String = "" FileClose(1) FileOpen(1, "c:\testi.csv", OpenMode.Input, OpenAccess.Read, OpenShare.Shared) Do While Not EOF(1) Input(1, haku) onpilkottu = False For i = 1 To Len(haku) merkki = Microsoft.VisualBasic.Mid(haku, i, 1) If merkki = vbTab Then For d = i + 1 To Len(haku) merkki = Microsoft.VisualBasic.Mid(haku, d, 1) If merkki = vbTab Then pituus = d - i siirto = Microsoft.VisualBasic.Mid(haku, i + 1, pituus - 1) info.Text &= siirto & vbCrLf onpilkottu = True GoTo ko End If Next End If ko: Next If onpilkottu = False Then info.Text &= haku & vbCrLf GoTo hyppy hyppy: Loop FileClose(1)
dim SR as new StreamReader("C:\teksti.txt") dim tekstitemp as string = SR.ReadToEnd() SR.close() dim teksti[] as string = tekstitemp.split(new string[] {vbtab,"\r\n"},stringsplitoptions.none)
en pääse nyt testaamaan pitäis toimia. tuossa tapauksessa lukee tiedoston ensin tekstitemppiin kokonaisuudessaan, jonka jälkeen erottelee string taulukkoon vbtabilla ja rivinvaihdolla
Hei groovyb
Kiitos!
Sain luettua rivin kerrallaan. Alla olevalla koodilla. Tuo split toiminto mulle täysin uutta ja ei menny jakeluun.
Ehtisitkö vähän selventää sen toimintaa...
Dim x As Long = 0 info.Text = "" Dim SR As New StreamReader("C:\testi.csv") Dim line As String Do line = SR.ReadLine info.Text &= line & vbCrLf x += 1 Loop Until SR.EndOfStream SR.Close()
no readline lukee rivin kerrallaan.
olisit voinut myös käyttää while SR.Read() (joka on true kun luku käynnissä, false kun lukeminen loppuu), ja käyttää readlinea sen avulla. eli while SR.Read(), jotain = SR.readline() etc.
split toiminnolla voit jakaa merkkijonon. esim jos merkkijono string tervehdys sisältää merkkijonon "Terve-Mieheen", voit jakaa sen taulukkoon jakamalla merkkijonon "-" merkillä.
dim Delimiter as char = "-" string[] Jaettu = tervehdys.Split(delimiter) 'Jaettu[0] = "Terve" 'Jaettu[1] = "Mieheen"
tai jos merkkijono tervehdys sisältää useampia jakomerkkejä
'Merkkijono Terve-Mieheen:Petteri dim Delimiter as char[] = {"-",":"}; string[] jaettu = tervehdys.Split(Delimiter) 'Jaettu[0] = "Terve" 'Jaettu[1] = "Mieheen" 'Jaettu[2] = "Petteri"
tai voit käyttää splitoptionseja, josta löytyy muun vaihtoehto, jolla taulukkoon ei tule yhtään tyhjää solua väliin jos erottelijoiden välissä on tyhjää.
tämän syntaksi on
xxxx.Split(new string[] {"jokumerkki","toinen merkki"},stringsplitoptions.xxxxxxxxx 'valitsemasi optio)
tämä palauttaa taulukkoon erotellut sanat valitulla optiolla. optio voi myös olla none, jolloin ei käytetä mitään optiota.
VB:ssä on vakiona myös "Snippettejä". Näistä löytyy usein käyttökelpoisia koodeja.
Mene koodiin halutulle riville. Klikkaa hiiren oikeaa näppäintä, valitse valikosta Insert snippet
Sieltä Fundamentals / File system / Read a delimited text file
Koodiin ilmestyy seuraava pätkä:
Dim filename As String = "C:\Test.txt" Dim fields As String() Dim delimiter As String = "," Using parser As New TextFieldParser(filename) parser.SetDelimiters(delimiter) While Not parser.EndOfData ' Read in the fields for the current line fields = parser.ReadFields() ' Add code here to use data in fields variable. End While End Using
Muutat vain tuon tiedoston nimen.
Valmiiksi erotellut yhden rivin tiedot ovat muuttujissa fields(0), fields(1), fields(2) jne, ja niiden käsittely tuohon kerrottun paikkaan.
Joskus täytyy vielä lisätä tekstin koodaus tuohon filenamen jälkeen, esimerkiksi
Using parser As New TextFieldParser(filename, System.Text.Encoding.UTF8)
(Ja VB lisää myös koodin alkuun tarvittavan Imports Microsoft.VisualBasic.FileIO)
jokke568 kirjoitti:
Jaksaisiko/ehtisikö joku vähän ohjata korjauksessa tai toisella tavalla tekemisessä?
Koodisi luettavuus paranisi suuresti, jos välttäisit tyhjien rivien turhaa käyttöä. Tyhjä rivi jokaisen koodirivin jälkeen venyttää koodia niin, että kokonaisuuden hahmottaminen vaatii ylimääräistä työtä.
onneksi on olemassa collapse to definitions \o/
itse käytän mieluusti rivinvaihtoja aina ennen looppia, ehtolauseketta tjms, jotta ne erottuu paremmin.
Yleisesti ottaen, onhan tuo koodailu mielenkiintoista, eihän sitä muuten harrastaisikaan. Eri kielistä olen tullut siihen mielipiteeseen, että vanha kunnon QBasic on hyvä, varsinkin matemaattisissa tehtävissä. Käppyrät ja muut on helppo piirtää. Tämä basic-kieli on liikaa aliarvostettu. Voi kumpa saisi vielä Lisp'n, jotta voisi kunnolla pakerrella sulkeiden ihanassa maailmassa.
Tuo Visual Basic ei minusta ole kummoinen, ei myöskään C#, joka tuntuu äkkisistään liiankin helpolta.
toiper-4
(Mod. huom: älä katko tekstirivejäsi itse.)
no nythän tästä vasta kunnon keskustelu lähtee käyntiin :)
Näin offtopic:na aiheeseen, minusta tuntuu että on loppupeleissä ihan sama mitä .net kielistä käyttää. Oikea valinta oikeaan tarkoitukseen. Jos normaalia työpäivääni ajattelen, niin yleensä se on c++ (ihan normi siis, ei c++/cli etc.) serveripuolen tarkoituksiin ja .NET kielistä valitsen jonkun client ja GUI puolen käpistelyyn. yleensä valitsen C#:n.
Aihe on jo aika vanha, joten et voi enää vastata siihen.