Как избежать ошибок «Конец файла»
-
16-09-2019 - |
Вопрос
Я пытаюсь импортировать файл с разделителями табуляции в таблицу.
Проблема в том, что ИНОГДА файл будет содержать неудобную запись с двумя «нулевыми значениями», из-за которой моя программа выдает «неожиданный конец файла».
Например, каждая запись будет иметь 20 полей.Но последняя запись будет иметь только два поля (два нулевых значения) и, следовательно, неожиданный EOF.
В настоящее время я использую StreamReader
.
Я пробовал посчитать строки и сказать bcp прекратить чтение до появления «фантомных нулей», но StreamReader
получает неправильное количество строк из-за «фантомных нулей».
Я попробовал следующий код, чтобы избавиться от всего фиктивного кода (код, заимствованный из сети).Но он просто заменяет поля пустыми местами (мне бы хотелось, чтобы в результате не осталось ни одной строки).
Public Sub RemoveBlankRowsFromCVSFile2(ByVal filepath As String)
If filepath = DBNull.Value.ToString() Or filepath.Length = 0 Then Throw New ArgumentNullException("filepath")
If (File.Exists(filepath) = False) Then Throw New FileNotFoundException("Could not find CSV file.", filepath)
Dim tempFile As String = Path.GetTempFileName()
Using reader As New StreamReader(filepath)
Using writer As New StreamWriter(tempFile)
Dim line As String = Nothing
line = reader.ReadLine()
While Not line Is Nothing
If Not line.Equals(" ") Then writer.WriteLine(line)
line = reader.ReadLine()
End While
End Using
End Using
File.Delete(filepath)
File.Move(tempFile, filepath)
End Sub
Я пробовал использовать SSIS, но обнаружил непредвиденную ошибку EOF.
Что я делаю не так?
Решение 5
Проблема была решена с использованием битового массива, проверяющего по одному биту на наличие подозрительного бита.
Другие советы
Если вы прочитаете весь файл в строковую переменную (используя readToEnd()), вы получите все это целиком?или вы просто доводите данные до этих фантомных нулей?
Пробовали ли вы использовать функцию Reader.ReadBlock(), чтобы попытаться прочитать файл, превышающий длину файла?
В нашей компании мы осуществляем сотни импортных операций каждую неделю.Если файл не отправлен в правильном формате, согласованном для нашего автоматизированного процесса, мы возвращаем его отправителю.Если последняя строка неверна, файл не следует обрабатывать, поскольку в нем может отсутствовать информация или он поврежден каким-либо другим образом.
Один из способов избежать ошибки — использовать ReadAllLines, а затем обрабатывать массив строк файла вместо того, чтобы проходить через файл.Это также намного эффективнее, чем потоковое чтение.
Dim fileLines() As String
fileLines = File.ReadAllLines("c:\tmp.csv")
...
for each line in filelines
If trim(line) <> "" Then writer.WriteLine(line)
next line
Вы также можете сохранить выходные строки в том же или другом массиве строк и использовать File.WriteAllLines для одновременной записи всего файла.
Вы можете попробовать встроенный объект .Net для чтения файлов, разделенных табуляцией.Это Microsoft.VisualBasic.FileIO.TextFileParser.