Как добавить EOF в файл, используя Perl или Python?
-
24-09-2019 - |
Вопрос
Я пытаюсь набросать данные вставки в базу данных SQL Server Express. При выполнении BCP из командной строки Windows XP я получаю следующую ошибку:
C: Temp> BCP в -T -F -S Начальная копия ... SQLState = S1000, NANANEMERROR = 0 Ошибка = [Microsoft] [NANY CLEAND CLEAND] [SQL] Неожиданные EOF, встречающиеся в BCP-файле данных 0, скопированные. Размер сетевого пакета (байты): 4096 часов времени (MS.) Всего: 4391
Итак, возникает проблема с EOF. Как добавить правильный символ EOF в этот файл, используя Perl или Python?
Решение
EOF - конец файла. Наверное, произошло, это то, что файл не завершен; Программное обеспечение ожидает данных, но их больше не было.
Эти виды вещей происходят, когда:
- Экспорт прерывается (бросить программное обеспечение сброса при сбросе)
- Копирование дамба, прерывая копию
- диск полный во время дамп
Эти виды вещей.
Кстати, хотя EOF обычно является просто конец файла, существует символ EOF. Это используется, поскольку вход с терминалом (командной строкой) действительно не заканчивается, как файл, который делает, но иногда необходимо пропустить EOF для такой утилиты. Я не думаю, что он используется в реальных файлах, по крайней мере, не указывать конец файла. Файловая система отлично знает хорошо, когда файл завершится, ему не нужен индикатор, чтобы найти это.
РЕДАКТИРОВАТЬ Бесстыдно скопировано с комментария, предоставленного Джоном Машином
Это может произойти (неоднозначно) в реальных файлах. Все, что ему нужно, это (1) пользователь ввода данных для ввода Ctrl-Z по ошибке, ничего не смотрите на экране, введите предполагаемый Shift-Z и продолжайте идти и (2) программное обеспечение Vavelation (например, Nepwew ) Что радостно принимает Ctrl-AnyKey в текстовых полях, и в вашей базе данных в нем есть небольшая бомба, просто ждет, пока кто-то создает запрос в плоский файл.
Другие советы
Неожиданные EOF означает, что BCP-ридер нашел EOF, когда ожидается больше данных. Этот EOF может быть:
(1) Фактический физический конец-файл (больше нет байтов для чтения). Это означает, что у вас неправильно отформатированные данные. Проверьте в конце вашего файла для неполной записи.
ИЛИ
(2) В Windows, где вы находитесь, программы, чтение файла в текстовом режиме, честь древней конвенции, унаследованной через MS-DOS из CP / M относительно CTRL-Z (aka ^ z aka 'x1a' aka sub aka заменитель) как Конец файлового маркера при чтении из любого файла не просто терминал. Это включает в себя Python - поведение определяется C Stdlib. Проверьте « x1a» в ваших данных.
Обновлять Отвечая на комментарии в разборчивой моде:
В Notepad ++ вы можете сделать его отображать необычные символы, сделав символ / шоу / показать все символы. Вы можете выполнить поиск, выполнив Ctrl-F, набрав x1a в Find какую коробку и выбирая расширенную переключатель на панели поиска.
Или вы можете с небольшим количеством 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? Хлопнуть!
Это не проблема с отсутствующими eof, но с eof то есть и не ожидается BCP.
Я не эксперт инструмента BCP, но похоже, что есть некоторая проблема с форматом ваших файлов данных.