Почему моя строка содержит только разрывы строк, если я использую визуализатор данных, а не наблюдаю за значением?

Мое приложение должно делать следующее:

  • Принять файл для ввода, каждая строка содержит 1 запись
  • Проверить записи
  • Удалить все недействительные записи
  • Передать оставшиеся данные в базу данных

Я столкнулся со странной проблемой, когда мой файл содержит несколько строк, и если я использую Data Visualizer в Visual Studio, строка содержит несколько строк, но когда я пытаюсь сохранить результат String.Split в массив (расщепление на \r\n) Я получаю только один элемент в моем массиве. Вот скриншот моей вкладки Watch:

Первый ряд мой 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)) = ""

Это исключение, потому что fileData имеет только 1 элемент. Но почему в нем только 1 элемент, я не понимаю. Окно Watch показывает мои строки одной строкой, но visualer показывает, что в нем есть переводы строк, так почему же мой сплит не работает?

Кроме того, у меня есть почти такой же код в C#, и он прекрасно обрабатывает тот же файл:

List<int> linesToExclude = new List<int>();
strBadRecs = ScanFile(strBaseDir, ref strErrorString, ref  strRtfErrString, ref strOutput, ref linesToExclude);

// Stripping out bad records
string[] splitter = {"\r\n"};
string[] fileData = objDemographicImport.FileData.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < linesToExclude.Count; i++)
{
    fileData[linesToExclude[i]] = String.Empty;
}

Так что я делаю не так?

1 ответ

Решение

"\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.

Другие вопросы по тегам