Почему TextFieldParser.ReadField удаляет последовательные символы новой строки из середины поля? - PullRequest
6 голосов
/ 16 ноября 2010

Я использую TextFieldParser VB.NET (Microsoft.VisualBasic.FileIO.TextFieldParser) для чтения файла с разделителями. Однако, когда я пытаюсь читать в поле с последовательными символами новой строки внутри поля, последовательные символы новой строки превращаются в одну новую строку. Я хотел бы, чтобы последовательные переводы строк были сохранены, но я не уверен, как.

Вот пример файла, в котором я читаю ровно с одним полем. Кавычки являются частью содержимого файла, и в нем есть три новых строки (включая два последовательных символа новой строки после строки 2):

"This is line 1
This is line 2

This is line 4, which follows two consecutive newlines."

Вот код, который я использую для анализа и чтения в файле:

Dim reader as New Microsoft.VisualBasic.FileIO.TextFieldParser(myFile, System.Text.Encoding.Default)
reader.TextFieldType = FileIO.FieldType.Delimited
reader.SetDelimiters(",")

Dim fields As String() = reader.ReadFields
Dim line As String = fields(0)

А вот содержимое переменной "line". Обратите внимание, что теперь есть только две новые строки:

This is line 1
This is line 2
This is line 4, which follows two consecutive newlines.

Что я могу сделать, чтобы сохранить последовательные символы новой строки?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Во-первых, согласно MSDN http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.readfields.aspx пустые строки игнорируются:

Если ReadFields встречает пустые строки, они пропущены и следующий непустая строка возвращается.

Я считаю, что вам нужно будет использовать ReadLine http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.readline.aspx и затем просмотреть результаты.

Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("C:\ParserText.txt")
    MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
    MyReader.Delimiters = New String() {","}
    Dim currentRow As String
    While Not MyReader.EndOfData
        Try
            currentRow = MyReader.ReadLine()
            'Manipulate line...
        Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
            MsgBox("Line " & ex.Message & " is invalid.  Skipping")
        End Try
    End While
End Using
0 голосов
/ 31 марта 2015

Вы могли бы взглянуть на свойство "LineNumber"? ...

(C #)

var beforeRead = _parser.LineNumber;
_parser.ReadFields();
var afterRead = _parser.LineNumber;

if(afterRead <= -1)
   lineNumber = beforeRead;
else                    
   lineNumber = afterRead - 1;

for (var blankLines = beforeRead; blankLines < afterRead-1; blankLines++)
{
    Console.WriteLine();
}

Я не проверял все крайние случаи пустых строк в конце и т. Д.

...