Почему моя строка содержит только разрывы строк, если я использую визуализатор данных, а не наблюдаю за значением?
Мое приложение должно делать следующее:
- Принять файл для ввода, каждая строка содержит 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.