Arrays VB使用逗号分隔符将文本从txt文件存储到2D数组
我一直在寻找答案,但很难将我的发现应用到我的代码/文本文件中 我有这个文本文件; 20,本 10,戴夫 7,鲍勃 分数和名字 我希望将数据从文本文件拉入二维数组,例如: 阵列0,0 阵列1,0 阵列0,1 阵列1,1 阵列0,2 阵列1,2 这将转化为 阵列20 阿雷本 阵列10 阿莱达夫 阵列7 arrayBobArrays 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。然后您可以创建一个播放器列表。这比摆弄索引更具可读性、可重用性和可
提前感谢正如我在评论中提到的,我会为此使用一个类 例如,具有两个属性的播放器:名称为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个小时哈哈。再次感谢,如果还有什么让我卡住了,我知道该去哪里。谢谢史蒂文的回复。我没有机会尝试你的建议,因为我第一次尝试了蒂姆的建议,结果成功了。但是谢谢你: