Я экспериментировал с основным Файлом VB.Net Строковое разделение и IO. Я встретился с этой проблемой. Я не знаю, имеет ли это некоторое отношение к Файлу Строковое разделение или IO.
Я пишу текст в файл как так
Dim sWriter As New StreamWriter("Data.txt")
sWriter.WriteLine("FirstItem")
sWriter.WriteLine("SecondItem")
sWriter.WriteLine("ThirdItem")
sWriter.Close()
Затем я читаю текст из файла
Dim sReader As New StreamReader("Data.txt")
Dim fileContents As String = sReader.ReadToEnd()
sReader.Close()
Теперь, я разделяю fileContents
использование Environment.NewLine
как разделитель.
Dim tempStr() As String = fileContents.Split(Environment.NewLine)
Когда я печатаю полученный массив, я получаю некоторые странные результаты
For Each str As String In tempStr
Console.WriteLine("*" + str + "*")
Next
Я добавил *s к началу и концу объектов Массива во время печати, для обнаружения то, что продолжается. С тех пор NewLine
используется в качестве разделителя, я ожидал, что строки в Массиве НЕ будут иметь любой NewLine. Но вывод был этим -
*FirstItem*
*
SecondItem*
*
ThirdItem*
*
*
Не был должен это быть этим -
*FirstItem*
*SecondItem*
*ThirdItem*
**
??
Почему там новая строка в начале всех кроме первой строки?
Обновление: Я сделал символ символьной печатью fileContents
и получил это -
F - 70
i - 105
r - 114
s - 115
t - 116
I - 73
t - 116
e - 101
m - 109
- 13
- 10
S - 83
e - 101
c - 99
o - 111
n - 110
d - 100
I - 73
t - 116
e - 101
m - 109
- 13
- 10
T - 84
h - 104
i - 105
r - 114
d - 100
I - 73
t - 116
e - 101
m - 109
- 13
- 10
Это кажется 'Средой. NewLine' состоит из
- 13
- 10
13 и 10..Я понимаю. Но промежуточный вакуум? Я не знаю, наступает ли это к печати к консоли или является действительно частью NewLine
.
Так, при разделении только эквивалент символов ASCII оценивает 13, который является первым символом NewLine
, используется в качестве разделителя (как объяснено в ответах), и остающийся материал все еще присутствует в строках. По некоторым причинам таинственный вакуум в списке выше и ASCII оценивает 10 вместе результат в распечатанной новой строке.
Теперь это ясно. Спасибо за справку.:)
Прежде всего, да, WriteLine
добавляет новую строку в конец строки, отсюда и пустая строка в конце.
Проблема в том, как вы вызываете fileContents.Split ()
. Единственная версия этой функции, которая принимает только один аргумент, принимает char ()
, а не строку
. Environment.NewLine
- это строка, а не char
, поэтому (при условии, что у вас есть Option Strict Off
), когда вы вызываете функцию, она неявно преобразует ее в char
, используя только первый символ в строке. Это означает, что вместо разделения вашей строки на фактическую последовательность из двух символов, составляющих Environment.NewLine
, она фактически разбивается только на первый из этих символов.
Чтобы получить желаемый результат, вам нужно вызвать его следующим образом:
Dim delims() as String = { Environment.NewLine }
Dim tempStr() As String = fileContents.Split(delims, _
StringSplitOptions.RemoveEmptyEntries)
Это приведет к разделению строки на фактическую строку, а не на первый символ, как сейчас, и все пустые записи из строки будут удалены. полученные результаты.
Почему бы просто не использовать File.ReadAllLines ? Один единственный вызов читает файл и возвращает массив строк со строками.
Dim tempStr() As String = File.ReadAllLines("data.txt")