Как добавить EOF в файл, используя Perl или Python? - PullRequest
0 голосов
/ 03 марта 2010

Я пытаюсь выполнить массовую вставку данных в экспресс-базу данных сервера SQL. При выполнении bcp из командной строки Windows XP я получаю следующую ошибку:

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. Как добавить правильный символ EOF в этот файл, используя Perl или Python?

Ответы [ 3 ]

3 голосов
/ 03 марта 2010

EOF - конец файла. Вероятно, произошло то, что файл не завершен; программное обеспечение ожидает данные, но их больше нет.

Такие вещи случаются, когда:

  • экспорт прерван (выйти из программы дампа во время дампа)
  • во время копирования дамп-файла, отменяющего копию
  • диск заполнен во время дампа

такие вещи.

Кстати, хотя EOF обычно является концом файла, существует символ EOF. Это используется потому, что ввод с терминала (командной строки) на самом деле не заканчивается, как файл, но иногда необходимо передать EOF такой утилите. Я не думаю, что он используется в реальных файлах, по крайней мере, не для обозначения конца файла. Файловая система прекрасно знает, когда файл закончился, ему не нужен индикатор, чтобы это выяснить.

РЕДАКТИРОВАТЬ бесстыдно скопировано из комментария, предоставленного Джоном Мачином

Это может произойти (неумышленно) в реальных файлах. Все, что ему нужно, это (1) пользователь, вводящий данные, который по ошибке набирает Ctrl-Z, ничего не видит на экране, набирает предполагаемый Shift-Z и продолжает работать и (2) проверяет программное обеспечение (написанное, например, племянником президента компании). ), который с радостью принимает Ctrl-anykey в текстовых полях, и в вашей базе данных есть небольшая бомба, просто ожидающая, что кто-то выдаст запрос к плоскому файлу.

3 голосов
/ 03 марта 2010

Неожиданный EOF означает, что читатель bcp обнаружил EOF, когда ожидал больше данных. Этот EOF может быть:

(1) фактический физический конец файла (больше нет байтов для чтения). Это означает, что у вас неверно отформатированные данные. Проверьте в конце вашего файла неполную запись.

OR

(2) в Windows, где вы находитесь, программы, читающие файл в текстовом режиме, соблюдают древнее соглашение, унаследованное через MS-DOS от CP / M относительно Ctrl-Z (иначе ^ Z aka \ 'x1A' aka SUB aka ЗАМЕНИТЬ) как маркер конца файла при чтении из ЛЮБОГО файла, а не только с терминала. Это включает в себя 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? Взрыв!

1 голос
/ 03 марта 2010

Это не проблема с отсутствующим EOF, но с EOF, который существует и не ожидается bcp.

Я не эксперт по bcp, но похоже, что есть проблема с форматом ваших файлов данных.

...