Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl或Python将EOF附加到文件中?_Python_Sql Server_Perl_Bcp - Fatal编程技术网

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

如何使用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

我正在尝试将数据批量插入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
因此,EOF存在一个问题。如何使用Perl或Python将正确的EOF字符附加到此文件?

这不是缺少EOF的问题,而是缺少bcp不期望的EOF


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

EOF是文件的结尾。可能发生的情况是文件不完整;软件需要数据,但现在已经没有了

这类事情发生在:

  • 导出被中断(转储时退出转储软件)
  • 复制转储文件时中止复制
  • 转储期间磁盘已满
这类事情

顺便说一下,虽然EOF通常只是文件的结尾,但确实存在EOF字符。这是因为终端(命令行)输入并不像文件那样结束,但有时需要将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分