避免“文件结束”错误

时间:2009-11-04 17:25:25

标签: vb.net tsql streamreader eof

我正在尝试将制表符分隔文件导入表格。

问题是,有时,该文件将包含一个有两个“空值”的笨拙记录,并导致我的程序抛出“意外的文件结束”。

例如,每条记录将有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 个答案:

答案 0 :(得分:0)

如果你把整个文件读成一个字符串变量(使用reader.ReadToEnd()),你会得到整件事吗?或者你只是将数据提供给那些幻像空值?

您是否尝试使用Reader.ReadBlock()函数尝试读取文件长度?

答案 1 :(得分:0)

在我们公司,我们每周都会进行数百次进口。如果文件没有以正确的,同意的格式发送给我们的自动化流程,我们会将其返回给发件人。如果最后一行是错误的,则不应处理该文件,因为它可能缺少信息或以其他方式损坏。

答案 2 :(得分:0)

避免错误的一种方法是使用ReadAllLines,然后处理文件行数组而不是通过文件。这比streamreader效率更高。

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一次性写入文件。

答案 3 :(得分:0)

您可以尝试使用内置的.Net对象来读取制表符分隔的文件。它是Microsoft.VisualBasic.FileIO.TextFileParser

答案 4 :(得分:0)

这是使用位数组解决的,一次检查一位是否为可疑位。

相关问题