如果我使用数据可视化工具而不是监视值,为什么我的字符串仅包含换行符?

时间:2018-08-01 14:46:06

标签: .net string vb.net split

我的应用程序应该执行以下操作:

  • 接受一个文件输入,每行包含1条记录
  • 验证记录
  • 剥离所有无效记录
  • 将剩余数据传递到数据库

我遇到一个奇怪的问题,我的文件包含多行,如果我在Visual Studio中使用Data Visualizer,则字符串包含多行,但是当我尝试将application/octet-stream的结果存储到数组(在String.Split上拆分)我在数组中仅得到一个元素。这是“监视”标签的屏幕截图:

enter image description here

第一行是我的\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

那我在做什么错了?

1 个答案:

答案 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。