【问题标题】:Using textfieldparser ReadFields() and storing multiple Lines In one array使用 textfieldparser ReadFields() 并将多行存储在一个数组中
【发布时间】:2015-02-20 22:00:21
【问题描述】:

我想知道是否有一种方法可以从多个文本文件中读取多行以逗号分隔的文本并将它们全部存储在同一个数组中而不会覆盖已经存在的数据?我尝试了多种方法,似乎没有任何效果。所以,例如:

Dim reader As TextFieldParser = New TextFieldParser("text1.txt")
 reader.TextFieldType = FieldType.Delimited
 reader.SetDelimiters(",")
Dim currentrow as string() = reader.ReadFields()
Dim storageArray() as string()
storageArray(0) = currentrow(0)
storageArray(1) = currentrow(1)
currentrow = reader.ReadFields()
storageArray(2) = currentrow(0)
storageArray(3) = currentrow(1)
Dim reader As TextFieldParser = New TextFieldParser("text2.txt")
 reader.TextFieldType = FieldType.Delimited
 reader.SetDelimiters(",")
 currentrow =  reader.ReadFields()
 storageArray(4) = currentrow(0)
 storageArray(4) = currentrow(1)
 ..... etc., etc.

当我尝试将一个数组的一个值分配给另一个数组时,我不断抛出 System.NullReferenceException...

我知道 ReadFields() 返回一个数组,所以我也尝试将每一行存储在一个锯齿状数组中,这会引发相同的错误。

作为对此的补充,我是否有更好的方法来做到这一点?我读了很多关于将整个文件读入一个数组然后解析它的内容,但我似乎仍然无法将一个数组的值存储在另一个数组中......

提前感谢大家的帮助!

【问题讨论】:

  • 使用列表(字符串)

标签: arrays vb.net csv textfieldparser


【解决方案1】:

要声明一个字符串数组,正确的语法如下

Dim storageArray(size) as String

其中 size 是您要存储在该数组中的元素数。
所以你上面的代码根本无法编译。

但是,在您的上下文中,您不知道该数组需要多大,因为您还没有读取文件。在这种情况下,最好的方法是使用List(Of String),它允许将新元素添加到列表中而无需重新调整数组的大小

所以你的代码可以写成

 Dim storageList = New List(Of String)()
 Using reader As TextFieldParser = New TextFieldParser("text1.txt")
     reader.TextFieldType = FieldType.Delimited
     reader.SetDelimiters(",")
     storageList.AddRange(reader.ReadFields())
 End Using
 Using reader As TextFieldParser = New TextFieldParser("text2.txt")
     reader.TextFieldType = FieldType.Delimited
     reader.SetDelimiters(",")
     storageList.AddRange(reader.ReadFields())
 End Using

 ....

请注意,像 TextFieldParser 这样的一次性对象需要在您完成使用后进行处理。因此,将所有内容包含在 Using 语句中

你可以使用 List(Of strig) 来循环数据

 for each data in storageList
     Console.WriteLine(data)
 next

或者使用像数组这样的单个元素

Dim data = storageList(0)

【讨论】:

  • 感谢史蒂夫的回复。我将不得不进一步研究 List(Of String) ,这对我来说是一个新的。但是我发现(在我在stackoverflow上发布三天后我会找到解决方案的数字)是我可以使用: Array.ConstraintedCopy(array1, 0, array2, 0, array1.Length ) 这会将array1的内容从索引0开始复制到数组2中,从索引0开始一直到array1的长度。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多