如何使用Perl或Python将EOF附加到文件?

时间:2010-03-03 13:35:58

标签: python sql-server perl bcp

我正在尝试将数据批量插入SQL Server express数据库。从Windows XP命令提示符执行bcp时,我收到以下错误:

C:\temp>bcp  in  -T -f  -S 

Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Native Client]Unexpected EOF encountered in BCP data-file

0 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 4391

因此,EOF存在问题。如何使用Perl或Python将正确的EOF字符附加到此文件?

3 个答案:

答案 0 :(得分:3)

EOF是文件结束。可能发生的是文件不完整;该软件需要数据,但没有任何数据可用。

这些事情发生在:

  • 导出中断(转储时退出转储软件)
  • 在复制转储文件时中止副本
  • 转储期间
  • 磁盘已满

这些事情。

顺便说一下,虽然EOF通常只是文件的结尾,但确实存在EOF字符。这是因为终端(命令行)输入并不像文件那样真正结束,但有时需要将EOF传递给这样的实用程序。我不认为它在真实文件中使用,至少不表示文件结束。文件系统在文件结束时非常清楚,它不需要指示器来查找文件。

编辑 从John Machin提供的评论中无耻地复制

它可以在(实际上)在真实文件中发生。它所需要的只是(1)一个数据输入用户错误地输入Ctrl-Z,屏幕上什么也看不到,输入预定的Shift-Z,继续前进和(2)验证软件(例如公司总裁的侄子写的) )在文本字段中愉快地接受Ctrl-anykey,并且您的数据库中有一个小炸弹,只是等待有人对平面文件进行查询。

答案 1 :(得分:3)

意外的EOF意味着bcp阅读器在期待更多数据时发现了EOF。这个EOF可以是:

(1)实际的物理文件结束(不再需要读取的字节数)。这意味着您的数据格式错误。检查文件末尾附近是否有不完整的记录。

OR

(2)在Windows上,你在哪里,以文本模式读取文件的程序遵守从CP-M通过MS-DOS继承的古老约定关于Ctrl-Z(又名^ Z又名'x1A'又名SUB aka SUBSTITUTE)作为从ANY文件读取时的文件结束标记,而不仅仅是终端。这包括Python - 行为由C stdlib决定。检查数据中的“\ x1A”。

更新以清晰易读的方式回复评论:

在Notepad ++中,您可以通过执行查看/显示符号/显示所有字符来显示异常字符。您可以通过执行Ctrl-F搜索,在“查找内容”框中键入\ x1a,然后在“搜索”面板中选择“扩展”单选按钮。

或者你可以用一点点Python得到第一个Ctrl-Z的行号:

bytes = open('bcp.dat', 'rb').read()
zpos = bytes.find('\x1a')
# if zpos is -1, no Ctrl-Z in file
print 1 + bytes[:zpos].count('\r\n')

创建.dat的地方并不重要。无意的Ctrl-Z可能发生在任何操作系统上创建的文件中的任何位置。它是作为重要的文本文件读取的地方 - Windows?砰!

答案 2 :(得分:1)

这不是缺少EOF的问题,但是有了EOF,而bcp并不期望这样做。

我不是bcp工具专家,但看起来数据文件格式存在问题。