Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Split()不';我不能正常工作_Vb.net_String - Fatal编程技术网

Vb.net Split()不';我不能正常工作

Vb.net Split()不';我不能正常工作,vb.net,string,Vb.net,String,我正在做一个计算评估,我遇到了拆分字符串的问题。由于某种原因,当字符串拆分时,数组将整个内容存储在变量(0)中。出现的错误是,当它尝试为TicketID(Index)赋值时,表示数组超出了范围 代码如下: Private Sub ReadInformation(ByRef TicketID() As String, CustomerID() As String, PurchaseMethod() As Char, NumberOfTickets() As Integer, FileName As

我正在做一个计算评估,我遇到了拆分字符串的问题。由于某种原因,当字符串拆分时,数组将整个内容存储在变量(0)中。出现的错误是,当它尝试为TicketID(Index)赋值时,表示数组超出了范围

代码如下:

Private Sub ReadInformation(ByRef TicketID() As String, CustomerID() As String, PurchaseMethod() As Char, NumberOfTickets() As Integer, FileName As String)

    Dim Line, TextArray(3) As String
    Dim Index As Integer

    FileOpen(1, FileName, OpenMode.Input)

    For Index = 0 To 499

        Input(1, Line)
        TextArray = Line.Split(",")

        CustomerID(Index) = TextArray(0)
        TicketID(Index) = TextArray(1)
        NumberOfTickets(Index) = TextArray(2)
        PurchaseMethod(Index) = TextArray(3)

        MessageBox.Show(CustomerID(Index))

    Next

    FileClose()

End Sub
下面是我试图读取的文本文件的前10行:

C001,F3,10,S
C002,F3,2,O
C003,F3,3,S
C004,W2,9,S
C005,T3,10,S
C006,F3,2,S
C007,W1,3,O
C008,W3,1,O
C009,T2,2,S
C010,F2,9,O
以下是我收到的错误消息:


我会使用一些列表而不是数组。这样,您就不必担心数组的长度,也不必担心行数是否少于500。当然,必须使用File.IO命名空间中更高级的NET Framework方法

Private Sub ReadInformation(TicketID As List(Of String), _
                            CustomerID As List(Of String), _
                            PurchaseMethod As List(Of Char), _
                            NumberOfTickets As List(Of Integer), _
                            FileName As String)

    for each line in File.ReadLines(FileName)
        Dim TextArray = Line.Split(","c)
        if TextArray.Length > 3 Then
            CustomerID.Add(TextArray(0))
            TicketID.Add(TextArray(1))
            ' This line works just because you have Option Strict Off
            ' It should be changed as soon as possible
            NumberOfTickets.Add(TextArray(2))
            PurchaseMethod.Add(TextArray(3)) 
        End If
    Next

End Sub
您可以调用此版本的代码来声明4个列表

Dim TicketID = New List(Of String)()
Dim CustomerID = New List(Of String)()
Dim PurchaseMethod = New List(Of Char)()
Dim NumberOfTickets = New List(Of Integer)()
ReadInformation(TicketID, CustomerID, PurchaseMethod, NumberOfTickets, FileName)
另一种更面向对象的方法是创建一个表示数据行的类。在循环中创建该类的实例,并将该实例添加到单个列表中

Public Class CustomerData
     Public Property TicketID As String
     Public Property CustomerID As String
     Public Property NumberOfTickets As Integer
     Public Property PurchaseMethod As Char
End Class
现在循环变为

Private Function ReadInformation(FileName As String) as List(Of CustomerData)

    Dim custData = New List(Of CustomerData)()
    For Each line in File.ReadLines(FileName)
        Dim TextArray = Line.Split(","c)
        if TextArray.Length > 3 Then
            Dim data = new CustomerData()
            data.CustomerID = TextArray(0)
            data.TicketID = TextArray(1)
            data.NumberOfTickets = TextArray(2)
            data.PurchaseMethod = TextArray(3)
            custData.Add(data)
        End If
    Next
    return custData
End Function
此版本只需要声明一个列表

您可以调用此版本的代码,只传递文件名并接收函数的结果

Dim customers = ReadInformation(FileName)
For Each cust in customers
    Console.WriteLine(cust.CustomerID)
    ...
Next
或者将其用作数组

Dim theFirstCustomer = customers[0]
Console.WriteLine(theFirstCustomer.CustomerID)

如果字符串中没有逗号,则得到一个逗号数组。数据是什么样子的?可能是第一行是空白的,第一行没有逗号(例如,是某种头记录),或者文件没有以兼容的格式编码(例如,ASCII与UNICODE),我将用我试图读取的文件中的一些文本更新帖子。第一行有数据,还有分隔文本的逗号。帮个忙。从VB6 era中删除这些遗留方法,并使用NET Framework中提供的更新更多的方法。第二个好处是,不要使用并行数组,而是使用一个类和一个数据集合。第三个好处可能是不要重新发明轮子并使用CSV解析器。NumberOfTickets.Add(TextArray(2))会给我一个错误Add不是“List(of Integer)(”的成员。另外,为了适应新的代码,我在这里要做哪些更改:
调用ReadInformation(TicketID、CustomerID、PurchaseMethod、NumberOfTickets、FileName)
这很奇怪。它与其他方法一样是一个列表,因此Add方法存在。在程序使用传递参数(如果有帮助的话)之前,可能有一些错误。另外,我不完全理解你的第二个解决方案。因为我还没有在VB.NET中被教过如何使用课堂。另外,对于票数,我可以使用一个字符串,然后将所述字符串转换为整数吗?是的,您可以使用一个字符串并将其转换为整数。我想提醒您的是,使用Option Strict Off转换是由VB.NET编译器自动执行的。使用整数是相对安全的,但使用其他数据类型,如小数或日期,转换可能会非常错误。最好开始在项目级别使用Option Strict On更新代码后,我仍然会收到一个错误,错误是'Dim NumberOfTickets=New List(Of Integer)()'类型的值'List(Of Integer)'无法转换为'List(Of Integer)()'