Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: [vb2008] CSV-tiedoston lukeminen

Sivun loppuun

jokke568 [07.05.2010 22:20:42]

#

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)

groovyb [07.05.2010 22:25:49]

#

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

jokke568 [07.05.2010 22:52:42]

#

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()

groovyb [08.05.2010 20:32:52]

#

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.

AimoKulaus [18.05.2010 09:00:42]

#

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)

Chiman [18.05.2010 11:37:14]

#

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ä.

groovyb [18.05.2010 15:46:25]

#

onneksi on olemassa collapse to definitions \o/

itse käytän mieluusti rivinvaihtoja aina ennen looppia, ehtolauseketta tjms, jotta ne erottuu paremmin.

toiper-4 [18.05.2010 21:07:39]

#

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.)

groovyb [18.05.2010 21:15:16]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta