我正在努力解决一小段代码问题。代码的作用是首先逐行加载CSV文件(从第3行开始),然后将其添加到数组中。然后运行正则表达式匹配,我想将值插入数组。
这是我的工作代码,它显示了一个包含实际匹配项的msgbox:
Dim file = "C:\Users\David\Desktop\mycsv.csv"
Dim basestatisticspath = Path.GetDirectoryName(file)
Dim statistics() As String = IO.File.ReadAllLines(file)
'Dim x As Integer = statistics.Length
'ReDim Preserve statistics(x)
Dim regexlang As Regex = New Regex("(?<=^"")\[.*\]")
Dim regexlinefilename As Regex = New Regex("(?<=^""\[.*?\]\s).*(?="")")
Dim linefilename As Match = Nothing
Dim langmatch As Match = Nothing
Dim filename() As String
Dim lang() As String
For i = 2 To UBound(statistics)
langmatch = regexlang.Match(statistics(i))
linefilename = regexlinefilename.Match(statistics(i))
MsgBox(langmatch.Value & linefilename.Value)
Next
效果很好,实际的匹配就是我想要的。所以我的下一步是将每个匹配添加到一个数组,然后使用它来生成其他文件。
因此我最终得到了这个:
Dim file = "C:\Users\David\Desktop\myscv.csv"
Dim basestatisticspath = Path.GetDirectoryName(file)
Dim statistics() As String = IO.File.ReadAllLines(file)
'Dim x As Integer = statistics.Length
'ReDim Preserve statistics(x)
Dim regexlang As Regex = New Regex("(?<=^"")\[.*\]")
Dim regexlinefilename As Regex = New Regex("(?<=^""\[.*?\]\s).*(?="")")
Dim linefilename As Match = Nothing
Dim langmatch As Match = Nothing
Dim filename() As String
Dim lang() As String
' Set all value line by line
For i = 2 To UBound(statistics)
langmatch = regexlang.Match(statistics(i))
linefilename = regexlinefilename.Match(statistics(i))
lang(i) = langmatch.Value.ToString
filename(i) = linefilename.Value.ToString
MsgBox(langmatch.Value & linefilename.Value)
Next
添加以下内容后,程序在该行崩溃
lang(i) = langmatch.Value.ToString
filename(i) = linefilename.Value.ToString
我假设您可以将正则表达式匹配的值添加到字符串的某个位置,但似乎我错了。
我一直在寻找没有结果的答案(至少对我的理解不够)。
如何将每个匹配项转换为字符串并将其添加到数组的i
位置?
提前致谢!
更新 正如@Tval解释的那样,我通过在声明时包含数组的大小来解决它。谢谢!
Dim filename(UBound(statistics)) As String
Dim lang(UBound(statistics)) As String
答案 0 :(得分:1)
您需要在引用数组之前对其进行初始化,否则您将获得空引用错误,同时您也无法引用尚未存在的索引或您已经存在获得超出范围异常的索引。
现在你使用一个固定长度的数组,所以如果你想为它添加一个值,你每次都必须重新声明一个索引。
如果你想要一个可变长度id的数组建议使用一个列表,那么你可以只添加值而不会出现任何问题
Dim myList = New List(Of String)
For Each foo As String In bar
myList.Add(bar)
Next