¿Cómo agregar EOF a un archivo utilizando Perl o Python?

Estoy tratando de insertar datos de forma masiva en la base de datos de SQL Server Express. Al hacer bcp desde el símbolo del sistema de Windows XP, aparece el siguiente error:

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

 Copia de inicio ...
 SQLState = S1000, NativeError = 0
 Error = [Microsoft] [SQL Native Client] Se ha encontrado un EOF inesperado en el archivo de datos BCP

 0 filas copiadas.
 Tamaño del paquete de red (bytes): 4096
 Reloj Tiempo (ms.) Total: 4391 

Por lo tanto, hay un problema con EOF. ¿Cómo agregar un carácter EOF correcto a este archivo usando Perl o Python?

EOF es End Of File. Lo que probablemente ocurrió es que el archivo no está completo; el software espera datos, pero ya no hay ninguno.

Este tipo de cosas suceden cuando:

  • la exportación se interrumpe (salir del software de volcado mientras se realiza el volcado)
  • Mientras copia el archivo de volcado abortando la copia
  • disco lleno durante el volcado

este tipo de cosas

Por cierto, aunque EOF suele ser solo un final de archivo, existe un carácter EOF. Esto se usa porque la entrada del terminal (línea de comando) no termina realmente como lo hace un archivo, pero a veces es necesario pasar un EOF a dicha utilidad. No creo que se use en archivos reales, al menos no para indicar un final de archivo. El sistema de archivos sabe perfectamente bien cuando el archivo ha finalizado, no necesita un indicador para averiguarlo.

EDITAR descaradamente copia de un comentario proporcionado por John Machin

Puede suceder (sin intención) en archivos reales. Todo lo que necesita es (1) un usuario de ingreso de datos que escriba Ctrl-Z por error, no vea nada en la pantalla, escriba el Shift-Z deseado y siga adelante y (2) el software de validación (escrito por, por ejemplo, el sobrino del presidente de la compañía ) que acepta felizmente Ctrl-anykey en los campos de texto y su base de datos tiene una pequeña bomba, esperando a que alguien realice una consulta en un archivo plano.

EOF inesperado significa que el lector bcp encontró un EOF cuando esperaba más datos. Este EOF puede ser:

(1) el final del archivo físico real (no se deben leer más bytes). Esto significa que tienes datos mal formateados. Verifique cerca del final de su archivo para un registro incompleto.

O

(2) en Windows, donde se encuentre, los progtwigs que leen un archivo en modo de texto respetan la antigua convención heredada a través de MS-DOS de CP / M en relación con Ctrl-Z (también conocido como ^ Z aka \ ‘x1A’ aka SUB aka SUBSTITUTE) como un marcador de fin de archivo al leer CUALQUIER archivo, no solo un terminal. Esto incluye Python: el comportamiento está determinado por C stdlib. Compruebe si hay ‘\ x1A’ en sus datos.

Actualización respondiendo a los comentarios de manera legible:

En Notepad ++, puede hacer que muestre caracteres inusuales haciendo Ver / Mostrar símbolo / Mostrar todos los caracteres. Puede buscar haciendo Ctrl-F, escribiendo \ x1a en el cuadro Buscar y seleccionando el botón de radio Extendida en el panel de búsqueda.

O puedes con un poco de Python obtener el número de línea del primer 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') 

Donde tu .dat fue creado no importa Un Ctrl-Z involuntario puede ocurrir en cualquier parte de un archivo creado en cualquier sistema operativo. Es donde se lee como un archivo de texto que importa: ¿Windows? ¡Explosión!

Este no es un problema con la falta de EOF, pero con EOF está ahí y no es esperado por bcp.

No soy un experto en herramientas bcp, pero parece que hay algún problema con el formato de sus archivos de datos.