Вопрос

Я пытаюсь импортировать файл с разделителями табуляции в таблицу.

Проблема в том, что ИНОГДА файл будет содержать неудобную запись с двумя «нулевыми значениями», из-за которой моя программа выдает «неожиданный конец файла».

Например, каждая запись будет иметь 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top