Вот кодированная процедура, описанная в комментариях:
- Прочитать все строки исходного входного файла,
- исправить ошибочные строки (с помощью Regex или чего-либо еще, что подходит),
- используйте
TextFieldParser
для выполнения анализа правильного ввода Join()
входных частей, созданных TextFieldParser
с использованием ,
в качестве разделителя - saveисправленные, восстановленные строки ввода в окончательный выходной файл
Я использую Wiktor Stribiżew Шаблон регулярного выражения: похоже, он должен работать с учетом описания проблемы.
Примечание :
Конечно, я не знаю, следует ли использовать определенную кодировку.
Здесь кодировка используется по умолчанию UTF-8 no-BOM
, вход и выход.
"FaultyInput.txt"
- это поврежденный исходный файл.
"FixedInput.txt"
- это файл, содержащий фиксированные входные строки (надеюсь)по регулярному выражениюВы также можете использовать MemoryStream
.
"FixedOutput.txt"
- конечный файл CSV
, содержащий поля, разделенные запятыми, и правильные значения.
Все эти файлы читаются / записываются по пути запуска исполняемого файла.
Dim input As List(Of String) = File.ReadAllLines("FaultyInput.txt").ToList()
For line As Integer = 0 To input.Count - 1
input(line) = Regex.Replace(input(line), "(""\b.*?\b"")|""", "$1")
Next
File.WriteAllLines("FixedInput.txt", input)
Dim output As List(Of String) = New List(Of String)
Using tfp As New FileIO.TextFieldParser("FixedInput.txt")
tfp.TextFieldType = FileIO.FieldType.Delimited
tfp.Delimiters = New String() {"|"}
tfp.HasFieldsEnclosedInQuotes = True
While Not tfp.EndOfData
Dim fields As String() = tfp.ReadFields
output.Add(String.Join(",", fields))
End While
End Using
File.WriteAllLines("FixedOutput.txt", output)
'Eventually...
'File.Delete("FixedInput.txt")