我的应用程序应该执行以下操作:
我遇到一个奇怪的问题,我的文件包含多行,如果我在Visual Studio中使用Data Visualizer,则字符串包含多行,但是当我尝试将application/octet-stream
的结果存储到数组(在String.Split
上拆分)我在数组中仅得到一个元素。这是“监视”标签的屏幕截图:
第一行是我的\r\n
变量,一个fileContents
如果我使用文本可视化工具,则可以看到它分为几行。如果我将这些数据复制并粘贴到记事本中,我们可以看到回车和换行符。
下面的行是string
数组,使用fileData
这是实际代码:
String.Split
所以我遇到的问题是我的Private Sub cmdImport_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdImport.Click
Dim fileContents As String = GetFileData(pStrBaseDir & pStrFileName)
Dim linesToExclude As List(Of Int16) = New List(Of Int16)
mfpScanFile(pStrBaseDir & pStrFileName, pErrorString, pRtfErrString, pStrOutput, linesToExclude)
'mfpScanFile loops over the file and validates the records, adding the row # to linesToExclude if the row is bad
'Here we attempt to remove the bad rows
'First we split the string on new lines into an array
'Then we clear each line specified by linesToExclude
Dim splitter As String() = {"\r\n"}
Dim fileData As String() = fileContents.Split(splitter, StringSplitOptions.RemoveEmptyEntries)
For i As Int16 = 0 To linesToExclude.Count - 1
fileData(linesToExclude(i)) = ""
Next
fileContents = String.Join("\r\n", fileData)
End Sub
Private Function GetFileData(ByVal strBaseDir As String) As String
If (Not System.IO.File.Exists(strBaseDir)) Then
GetFileData = String.Empty
Exit Function
End If
Dim sb As StringBuilder = New StringBuilder()
For Each line As String In System.IO.File.ReadAllLines(strBaseDir)
Dim elements As String() = line.Split(",")
If (Not elements.Length = 15) Then
GetFileData = "BadCommaCount"
Exit Function
End If
sb.AppendLine(line)
Next
GetFileData = sb.ToString()
End Function
循环在此行上引发了异常:For
由于fileData(linesToExclude(i)) = ""
仅包含1个元素,因此引发异常。但是为什么它只有1个元素是我不了解的。 “监视”窗口将我的字符串显示为单行,但可视化工具显示它具有换行符,那么为什么拆分无法正常工作?
此外,我在C#中具有几乎完全相同的代码,并且可以完美地处理同一文件:
fileData
那我在做什么错了?
答案 0 :(得分:3)
“ \ r \ n”不能满足您在vb中的期望。尝试其中之一。
Dim s1 As String = vbCrLf
Dim s2 As String = Environment.NewLine
Dim s3 As String = Chr(13) & Chr(10)
请注意,您在此处执行冗余逻辑。您将获得一个行列表,将它们连接为一个字符串,然后将其拆分为行列表。只需使GetFileData返回行列表即可,而不使用StringBuilder。
我在没有编译任何内容的情况下进行了此示例,可能会出现错误。
Private Function GetFileData(ByVal strBaseDir As String) As List(Of String)
If (Not System.IO.File.Exists(strBaseDir)) Then
GetFileData = String.Empty
Return Nothing
End If
Dim lines As new List(Of String)
For Each line As String In System.IO.File.ReadAllLines(strBaseDir)
Dim elements As String() = line.Split(",")
If (Not elements.Length = 15) Then
lines.Clear()
lines.Add("BadCommaCount")
Return lines
End If
lines.Add(line)
Next
Return lines
End Function
此外,“ GetFileData = sb.ToString()”可能会造成混淆,我建议您使用Return。