Ik heb problemen met een split in multi-array

Status
Niet open voor verdere reacties.

BartP

Gebruiker
Lid geworden
10 jan 2008
Berichten
37
Mijn probleem is dat ik bij een Array en een String (strSplit en DataArray(x, y) de volgende melding krijg " Value of type '1-dimensional array of string cannot be converted to string". Alleen ik zou niet weten hoe ik dit moet fixen en dat hij alsnog de Array en de strSplit de ; telt. Wie ziet dit wel.

Bvd.
Bart

PHP:
Imports System.IO

Public Class AllensWoodShop

    Dim cntLines As Integer
    Dim cntSplit As Integer

    Public Function getLines()
        Dim fileName As String = "woodsheets.txt"
        Dim MyStream As New StreamReader(fileName)
        Dim strSplit As String

        Try
            strSplit = MyStream.ReadLine.Split(";")

            For Each c As Char In strSplit
                If c = ";" Then
                    cntSplit += 1
                End If
            Next

            While Not (MyStream.ReadLine() Is Nothing)
                cntLines += 1
            End While

        Catch ex As Exception

        End Try

        Return cntLines & cntSplit

    End Function


    Private Function getArray()
        getLines()
        Dim lineNr As Integer = 0
        Dim Item(3) As String
        Dim DataArray(3, cntLines - 1) As String
        Dim fileName As String = "woodsheets.txt"


        Try
            MsgBox(cntLines)
            MsgBox(cntSplit)
            Dim MyStream As New StreamReader(fileName)

            For y As Integer = 0 To cntLines - 1
                For x As Integer = 0 To cntSplit
                    DataArray(x, y) = MyStream.ReadLine.Split(";")
                Next x


            Next y
        Catch ex As Exception

        End Try



        Return DataArray
    End Function


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'bin\debug is de basic folder
        getArray()
    End Sub

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
        Me.Close()
    End Sub

    Private Sub btnQuit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuit.Click
        Me.Close()
    End Sub

    Private Sub lstbxArticles_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstbxArticles.SelectedIndexChanged
        Select Case lstbxArticles.SelectedIndex
            Case 0
            Case 1
            Case 2
        End Select
    End Sub


End Class
 
Laatst bewerkt:
Kun je misschien aangeven waar het precies fout gaat? Op welke regel?
 
regel 14 ... strSplit = MyStream.ReadLine.Split(";")
en
regel 50 ... DataArray(x, y) = MyStream.ReadLine.Split(";")
 
Weet je zeker dat de streamreader data bevat? Je zou namelijk het volledige pad naar het bestand moeten opgeven ipv alleen de bestandsnaam.
 
Mark,

Daar ben ik zeker van. Dit omdat ik wel het correcte aantal cntLines terug krijg.

Groet,
Bart
 
Ik vind het wel bijzonder dat je dat niet hoeft te doen, aangezien het bij mij namelijk gewoon fout gaat als ik niet het volledige pad opgeef.

Maar goed de fout zit in
Dim strSplit as String.. Dit moet worden Dim strSplit() as String

Daarnaast moet je volgens mij ook deze aanpassen

Code:
For each c as Char in strSplit
If c=";" Then 
 cntSplit + 1
End If
Next

naar

Code:
For each c in strSplit
 cntSplit + 1
Next

De values in strSplit() bevatten namelijk geen ; meer, dus daar op checken heeft ook geen zin. Is altijd 0 in jouw code.
 
Laatst bewerkt:
Die aanpassing werkt niet .. ik zit nog steeds de regels
regel 14 ... strSplit = MyStream.ReadLine.Split(";")
regel 50 ... DataArray(x, y) = MyStream.ReadLine.Split(";")

En ik krijg daar de array melding zoals boven gegeven.
 
Laatst bewerkt:
Deze ook aangepast?

Code:
Dim strSplit() as String

Op deze DataArray(x, y) = MyStream.ReadLine.Split(";") krijg ik inderdaad ook een foutmelding, maar ik heb ook geen idee wat je wilt wat daar gaat gebeuren... Misschien kan je aangeven wat precies het doel is, wellicht zijn er andere oplossingen...
 
Ook de waarde blijft 0 en ik krijg die multidimensionele array ook niet gevuld met tekst
 
Deze werkt zonder foutmeldingen en het resultaat wat je zou verwachten...

Code:
    Public Function getLines()
        Dim fileName As String = "D:\woodsheets.txt"
        Dim MyStream As New StreamReader(fileName)
        Dim strSplit() As String

        Try
            strSplit = MyStream.ReadLine.Split(";")

            For Each c As Char In strSplit
                cntSplit += 1
            Next

            While Not (MyStream.ReadLine() Is Nothing)
                cntLines += 1
            End While


        Catch ex As Exception

        End Try

        Return cntLines & cntSplit

    End Function
 
thnx,

If clause verwijderd en hij doet het.. weet je ook de oplossing voor
DataArray(x, y) = MyStream.ReadLine.Split(";")

Wat als ik bijvoorbeeld DataArray(x, y) = Cstr("Dit is mooi") dan vult hij m .. maar nu met readline.split doet hij het niet
 
Wat als ik bijvoorbeeld DataArray(x, y) = Cstr("Dit is mooi") dan vult hij m .. maar nu met readline.split doet hij het niet

Het verschil is dat Cstr("Dit is mooi") een string is. (Overigens kan Cstr weglaten en gewoon DataArray(x,y) = "Dit is mooi" schrijven.) Echter myStream.readline.split(";") levert je geen string op maar een array van strings. Dat is ook precies de foutmelding die je krijgt. Want je kan van een array niet zo maar een string maken.

Maar waarom werk je zo ingewikkeld?? Wat is de bedoeling van je script. Aangezien je dat niet vermeld hebt, neem ik aan dat je gewoon alle items uit je tekstbestand wilt hebben welke gesplit zijn door een ; Met onderstaande functie krijg je de lijst met alle items in de text bestand (mits het laatste item ook eindigt met een ;, anders krijg je de 1e en de laatste gecombineerd)

Tevens heb je getLines dan ook niet meer nodig....

Code:
Private Function getArray() As List(Of String)
        Dim fileName As String = "D:\woodsheets.txt"
        Dim stringList As New List(Of String)

        Dim myStream As New StreamReader(fileName)


            Dim fileContent = myStream.ReadToEnd
            For Each wood In fileContent.Split(";")
                stringList.Add(wood)
            Next

        Return stringList
    End Function
 
Mijn programma moet data uit een txtfile halen en die vullen in een listbox. Hij dient in vieren gesplitst te worden.

dit is vb van input in text
artnr omschrijving prijs aantal
081372; Woodsheet; 19.45; 0

Hierbij heb ik de bovenstaande gegevens nodig voor ordering.txt om de content erin te schrijven tevens dient het aantal dan aangepast te worden naar het aantal woodsheets dat besteld word numericUpDown. Vandaar dat ik het in stukken gesplit moet hebben en via de selectcase wordt de DataArray() gebruikt om het specifieke nummer aan te passen. en weer in te laden in de listbox.

Ik hoop dat het nu wat duidelijker is en vandaar waarschijnlijk de moeilijke benadering.

Bvd,
Bart
 
Is dit wat?

Code:
Imports System.IO

Public Class AllensWoodShop
    Private Function GetWoodsheets() As List(Of Woodsheet)
        Dim fileName As String = "D:\woodsheets.txt"
        Dim woodsheets As New List(Of Woodsheet)

        Dim filecontent = File.ReadAllLines(fileName)
        For Each line In filecontent
            Dim woodsheet = line.Split(";")
            Dim myWoodsheet As New Woodsheet
            myWoodsheet.ArtikelNummer = woodsheet(0)
            myWoodsheet.Naam = woodsheet(1)
            myWoodsheet.Prijs = CDec(woodsheet(2))
            myWoodsheet.Aantal = CInt(woodsheet(3))
            woodsheets.Add(myWoodsheet)
        Next

        Return woodsheets
    End Function
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListBox1.DataSource = GetWoodsheets()
        ListBox1.DisplayMember = "Naam"
    End Sub
End Class

Public Class Woodsheet
    Public Property ArtikelNummer As String
    Public Property Naam As String
    Public Property Prijs As Decimal
    Public Property Aantal As Integer
End Class
 
Daar was ik weer :D Er zit een fout op lijn 65

Code:
For Each line In filecontent
            Dim Article = line.Split(";")
            Dim myArticle As New Articles()
            myArticle.Artnr = Article(0)
            myArticle.Description = Article(1)
            myArticle.Price = Article(2)
            myArticle.NumberOf = Article(3)
[B]            lstbxArticles.Items.Add(myArticle)[/B]
        Next

Moet worden:

Code:
articles.items.add(myarticle)
 
ik krijg nu _899Q6.Articles krijg ik nu in mijn Listbox
Terwijl het zou moeten zijn
081372; Woodsheet; 19.45; 0

Het is de pest dat ik zo`n beginner ben.
 
Je moet ergens beginnen toch :-). Als je een breakpoint zet op lijn 77 kan je precies zien wat er in de datasource zit. Klopt dat wel?

Ow ja daarnaast is het gebruikelijk om een class een naam in enkelvoud te geven (mits het een collectionclass is) Dus Public Class Article
 
Warning 1 Variable 'Description' is used before it has been assigned a value. A null reference exception could result at runtime.
 
Laatst bewerkt:
Het valt me nu pas op dat je Class Article niet klopt. Je properties moeten allemaal aangepast worden van:

Code:
Private PriceValue As Decimal
    Public Property Price() As Decimal
        Get
            Return Price
        End Get
        Set(ByVal value As Decimal)
           PriceValue = value
        End Set
End Property

Naar

Code:
Private PriceValue As Decimal
    Public Property Price() As Decimal
        Get
[B]            Return PriceValue[/B]
        End Get
        Set(ByVal value As Decimal)
           PriceValue = value
        End Set
End Property

Daarnaast is het gebruikelijk om je naamgeving van je Private hetzelfde te noemen als je Public Property alles beginnend met een _ en een kleine letter, dus dan wordt het:

Code:
Private _price As Decimal
    Public Property Price() As Decimal
        Get
            Return _price
        End Get
        Set(ByVal value As Decimal)
           _price = value
        End Set
End Property

Snel properties aanmaken: Typ Prop en dan 2x maal TAB
:thumb:

Nog 1tje dan. Als je een .net 4.0 werkt kan je gebruik maken van Automatic Properties en is dit genoeg en toch gelijk aan bovenstaande:

Code:
      Public Property Price as Decimal
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan