Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays VB使用逗号分隔符将文本从txt文件存储到2D数组_Arrays_Vb.net_File_Text_2d - Fatal编程技术网

Arrays VB使用逗号分隔符将文本从txt文件存储到2D数组

Arrays VB使用逗号分隔符将文本从txt文件存储到2D数组,arrays,vb.net,file,text,2d,Arrays,Vb.net,File,Text,2d,我一直在寻找答案,但很难将我的发现应用到我的代码/文本文件中 我有这个文本文件; 20,本 10,戴夫 7,鲍勃 分数和名字 我希望将数据从文本文件拉入二维数组,例如: 阵列0,0 阵列1,0 阵列0,1 阵列1,1 阵列0,2 阵列1,2 这将转化为 阵列20 阿雷本 阵列10 阿莱达夫 阵列7 arrayBob 提前感谢正如我在评论中提到的,我会为此使用一个类 例如,具有两个属性的播放器:名称为String,分数为Int32。然后您可以创建一个播放器列表。这比摆弄索引更具可读性、可重用性和可

我一直在寻找答案,但很难将我的发现应用到我的代码/文本文件中

我有这个文本文件; 20,本 10,戴夫 7,鲍勃

分数和名字

我希望将数据从文本文件拉入二维数组,例如:

阵列0,0 阵列1,0 阵列0,1 阵列1,1 阵列0,2 阵列1,2

这将转化为

阵列20 阿雷本 阵列10 阿莱达夫 阵列7 arrayBob


提前感谢

正如我在评论中提到的,我会为此使用一个类

例如,具有两个属性的播放器:名称为String,分数为Int32。然后您可以创建一个播放器列表。这比摆弄索引更具可读性、可重用性和可维护性,也更不容易出错

Public Class Player
    Public Property Name As String
    Public Property Score As Int32
End Class
下面是一个可读的LINQ查询,它根据文本文件中的行初始化播放器列表:

Dim allPlayers = From line In System.IO.File.ReadLines("path")
                 Let Columns = line.Split(","c)
                 Where Columns.Length = 2
                 Let Score = Int32.Parse(Columns(0).Trim())
                 Let Name = Columns(1).Trim()
                 Select New Player With {.Score = Score, .Name = Name}
Dim playerList As List(Of Player) = allPlayers.ToList()
如果需要阵列,请使用ToArray而不是ToList

您可以通过indexerlist0或LINQ方法访问类似数组的列表:

Dim firstPlayer As Player = playerList.FirstOrDefault()  ' is Nothing if there are no players '
Console.WriteLine("Name of the player: " & firstPlayer.Name)
Console.WriteLine("His score is: " & firstPlayer.Score)
或在循环中:

For Each player In playerList
    Console.WriteLine("Player {0} has scored {} points.", player.Name, player.Score)
Next
顺便说一句,LINQ在保持代码可读性方面很有用,它还使用循环。因此,您可以简单地使用按分数排序玩家,并输出得分最高的前3名:

Dim best3Players = From player In playerList
                   Order By Player.Score Descending
                   Take 3
                   Select String.Format("{0}({1})", player.Name, player.Score)
Dim output = String.Join(", ", best3Players)
Windows.Forms.MessageBox.Show(output) ' since you have mentioned messagebox '

如果您知道文件不会太大,最简单的方法就是简单地使用file.ReadAllLines方法,该方法返回一个一维字符串数组,其中文件中每行包含一项。然后,您可以循环遍历每一行,并使用String.Split方法从该行中拆分两个值,例如:

Dim lines() As String = File.ReadAllLines("leaderboard.csv")
Dim values(lines.Length - 1, 1) As String
For i As Integer = 0 to lines.Length - 1
    Dim parts() As String = lines(i).Split(","c)
    values(i, 0) = parts(0)
    values(i, 1) = parts(1)
Next
但是,最好创建一个类来存储每行的所有数据,如下所示:

Public Class LeaderboardEntry
    Public Property PlayerName As String
    Public Property Score As Integer
End Class
Dim entries As New List(Of LeaderboardEntries)()
For Each i As String In File.ReadAllLines("leaderboard.csv")
    Dim parts() As String = lines(i).Split(","c)
    Dim entry As New LeaderboardEntry()
    entry.Score = parts(0)
    entry.PlayerName = parts(1)
    entries.Add(entry)
Next
30,"Doe, John"
然后,您可以将这些值加载到这些对象的列表中,如下所示:

Public Class LeaderboardEntry
    Public Property PlayerName As String
    Public Property Score As Integer
End Class
Dim entries As New List(Of LeaderboardEntries)()
For Each i As String In File.ReadAllLines("leaderboard.csv")
    Dim parts() As String = lines(i).Split(","c)
    Dim entry As New LeaderboardEntry()
    entry.Score = parts(0)
    entry.PlayerName = parts(1)
    entries.Add(entry)
Next
30,"Doe, John"
然后,不是说values0,0来获得第一个条目的分数,而是说entries0.score,这更易于阅读,尤其是如果在文件中的每一行添加更多字段。有关将类用于此类内容的价值的更多信息,请查看我的答案

但是请记住,上面的代码假定每一行的格式都正确。如果文件包含任何不包含逗号的行,它将失败。如果您需要处理这种情况,您需要添加一些额外的检查。此外,在上述场景中,播放器名称不能包含任何逗号。最好的处理方法是使用正确的CSV格式,如下所示:

Public Class LeaderboardEntry
    Public Property PlayerName As String
    Public Property Score As Integer
End Class
Dim entries As New List(Of LeaderboardEntries)()
For Each i As String In File.ReadAllLines("leaderboard.csv")
    Dim parts() As String = lines(i).Split(","c)
    Dim entry As New LeaderboardEntry()
    entry.Score = parts(0)
    entry.PlayerName = parts(1)
    entries.Add(entry)
Next
30,"Doe, John"
然后你的引号需要转义,等等,在这种情况下,使用TextFieldParser类读取CSV文件而不是重新发明轮子是值得的。另一种选择是简单地禁止用户在其名称中输入逗号。但是,如果采用这种方法,最好为分隔符选择一个不太常见的字符,例如管道符号|

我建议使用XML文件而不是CSV文件。然后,即使数据变得越来越复杂,您也可以轻松地存储数据,并使用XmlSerializer、XmlDocument或XDocument对其进行读写


如果您只需要存储这样的简单值,那么更好的选择可能是使用My.Settings功能。

为什么不为此使用类?例如,具有两个属性的播放器:名称为String,分数为Int32。然后您可以创建一个播放器列表。这比摆弄索引更具可读性、可重用性和可维护性,也更不容易出错。同意……除非这是家庭作业,你需要使用2D数组?谢谢你的回复。我应该提一下,我对VB还很陌生,大约几个小时。我的计划是让玩家玩游戏,当游戏结束时,问玩家他们的名字。并将其与分数一起存储在文本文件中。然后可以从文本文件中提取排行榜,并以不同的格式显示,即无作业。我只是在尝试一些东西。@Idle_Mind-你不觉得使用XMLSerializer太过分了吗?他已经说过他是个新手,这对他来说是个学习的过程。在这种情况下,在System.IO中使用.NET内置的文本文件操作功能更有意义。使用System.IO.File.ReadAllLines将数据拉入数组,然后实例化您建议的类对于初学者来说会容易得多。再次感谢Tim,我已经这样做了,似乎正在将数据拉入“列表”。我刚刚在VisualStudio2010中发现了Autos窗口,其中有每个玩家,他们的分数是成对的。如何使用这些名称和分数。例如在msgbox中显示名称或分数。我试过MsgBox0,Name,Score,MsgBox0。Name,MsgboxplayerList,0,Name,MsgBoxplayerList0…@BenBowden:你注意到我已经编辑了我的答案吗?蒂姆,这太棒了。我使用了你的第一个、第二个和最后一个代码片段,效果非常好。。。只需显示前三名玩家。。。只是
你花了6个小时哈哈。再次感谢,如果还有什么让我卡住了,我知道该去哪里。谢谢史蒂文的回复。我没有机会尝试你的建议,因为我第一次尝试了蒂姆的建议,结果成功了。但是谢谢你: