0

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

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

例如,每条记录将有 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 意外错误。

我究竟做错了什么?

4

5 回答 5

0

如果您将整个文件读入一个字符串变量(使用 reader.ReadToEnd()),您会得到全部内容吗?还是您只是将数据增加到那些幻像空值?

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

于 2009-11-04T19:04:52.593 回答
0

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

于 2009-11-04T19:09:36.273 回答
0

避免错误的一种方法是使用 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 一次写入文件。

于 2009-11-05T04:08:12.720 回答
0

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

于 2009-11-05T11:04:20.580 回答
0

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

于 2009-12-11T17:08:29.637 回答