如何使用Perl或Python将EOF附加到文件中?
我正在尝试将数据批量插入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 C:\temp>bcp in-T-f-S 正在开始复制。。。 SQLState=S1000,NativeError=0 错误=[Microsoft][SQL本机客户端]在BCP数据文件中遇到意外的EOF 已复制0行。 网络数据包大小(字节):4096 时钟时间(毫秒)总计:4391如何使用Perl或Python将EOF附加到文件中?,python,sql-server,perl,bcp,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. Networ
因此,EOF存在一个问题。如何使用Perl或Python将正确的EOF字符附加到此文件?这不是缺少EOF的问题,而是缺少bcp不期望的EOF
我不是bcp工具专家,但看起来您的数据文件的格式有问题。EOF是文件的结尾。可能发生的情况是文件不完整;软件需要数据,但现在已经没有了 这类事情发生在:
- 导出被中断(转储时退出转储软件)
- 复制转储文件时中止复制
- 转储期间磁盘已满
它可以发生在真实文件中(非常规)。它所需要的是(1)数据输入用户错误地键入Ctrl-Z,在屏幕上看不到任何内容,键入预期的Shift-Z,然后继续;(2)验证软件(由公司总裁的侄子编写),该软件在文本字段中愉快地接受Ctrl-anykey,并且您的数据库中有一个小炸弹,只是等待某人对平面文件生成查询 意外EOF表示bcp读取器在需要更多数据时发现EOF。此EOF可以是: (1) 文件的实际物理结尾(不再读取字节)。这意味着您有格式错误的数据。检查文件末尾是否有不完整的记录 或 (2) 在您所在的Windows上,以文本模式读取文件的程序遵守从CP/M通过MS-DOS继承的古老惯例,即在读取任何文件(而不仅仅是终端)时,将Ctrl-Z(又名“^Z”又名“x1A”又名“SUB”又名“替换”)作为文件结束标记。这包括Python——行为由C stdlib决定。检查数据中是否有“\x1A” 更新以清晰的方式回应评论: 在记事本++中,您可以通过执行查看/显示符号/显示所有字符使其显示不寻常的字符。通过执行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?砰 谢谢,如何从数据中找到“\x1A”?在记事本++中查看我的.dat时,我只能看到基本文本。事实上,我的.dat是在Unix机器上制作的。我自己解决了这个问题!我使用perl oneliner将unix换行符转换为dos/windows换行符:perl-pe的|\n |\r\n |'>data.data你是说文件中有unix换行符会导致bcp过早抛出EOF吗?是的,这似乎是最重要的原因problem@extraneon:它可以在真实文件中发生(非常规)。它所需要的是(1)数据输入用户错误地键入Ctrl-Z,在屏幕上看不到任何内容,键入预期的Shift-Z,然后继续;(2)验证软件(由公司总裁的侄子编写),该软件在文本字段中愉快地接受Ctrl-anykey,并且您的数据库中有一个小炸弹,只是等着有人对一个平面文件提出查询,然后无耻地抢夺你几乎不配得到的45分