避免“文件结束”错误
问题描述:
我试图将制表符分隔文件导入到表中。避免“文件结束”错误
问题是,SOMETIMES,该文件将包含一个含有两个“空值”的尴尬记录,并导致我的程序抛出“意外的文件结束”。
例如,每个记录将有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意外的错误。
我在做什么错?
答
这是使用位阵列解决的,一次检查一位嫌疑位。
答
如果你将整个文件读入一个字符串变量(使用reader.ReadToEnd())你会得到整个事情吗?还是只是将数据提供给那些幻像空值?
您是否尝试过使用Reader.ReadBlock()函数尝试读取文件长度?
答
在我们公司,我们每周都会进行数百次进口。如果文件没有以正确的,同意的格式发送给我们的自动过程,我们会将其发回给发件人。如果最后一行错误,则不应该处理该文件,因为它可能缺少信息或以其他方式损坏。
答
避免错误的一种方法是使用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输出线写入文件的一次。