Как определить, что файл не является ANSI-Latin1? - PullRequest
2 голосов
/ 19 сентября 2009

У меня есть проект импорта даты, в котором клиенты отправляют файлы в кодировке ANSI-latin1 (iso-8859-1). Однако ... Кажется, что еженедельно мы получаем файл-сюрприз, файл которого имеет неправильный формат, а импорт в основном ужасно умирает и требует ручного вмешательства для восстановления и продолжения ... Большинство распространенных плохих форматов файлов, кажется, быть Excel, сжать файл или файл XML / HTML ...

Итак, чтобы смягчить вмешательство человека, я хотел бы разумно определить, есть ли у нас сильный файл-кандидат ANSI, прежде чем пытаться просмотреть каждую строку файла в поисках 1 из 64 плохих символов, а затем сделать предположение о плохая ли целая строка или файл из-за количества найденных плохих символов…

Я думал о том, чтобы, возможно, сделать проверку Unicode / UTF и / или проверку магического числа, или вечером, пытаясь проверить несколько конкретных типов приложений. У файлов нет расширений, поэтому любая проверка будет выполняться путем изучения содержимого и любых быстрый способ исключить файл как не-ANSI был бы идеальным, поскольку процесс импорта должен обрабатывать 100-500 записей в секунду.

ПРИМЕЧАНИЕ. Нам было отправлено более 100 различных типов плохих файлов, включая изображения и файлы PDF. Таким образом, существует обеспокоенность по поводу того, можете ли вы легко и быстро исключить LTOS различных типов, не соответствующих стандарту ANSI, вместо того, чтобы специально ориентироваться только на несколько ...

Ответы [ 5 ]

5 голосов
/ 19 сентября 2009

Принимая во внимание ваш пример «плохих» типов файлов, я бы сказал, поставил серию быстрых проверок первых нескольких байтов файла:

  • Является ли UTF-16 BOM?
  • Это "<html" или "<!DOCTYPE"?
  • Это "<xml"?
  • Имеет ли он NUL-символ?
  • Это `PK \ 003 \ 004 '(заголовок zip-файла?)
  • Так ли это (с чего бы не начинались файлы Excel; вам придется искать его на 8 -)
2 голосов
/ 19 сентября 2009

Мне нравится ответ RichieHindle, это очень хорошо. Вы также должны посмотреть на обработку ошибок в вашем импорте. Если вы обнаружите плохой файл, запишите ошибку и войдите в нее. Вам не следует останавливать импорт других файлов или, что еще хуже, импорт других клиентов из-за одной ошибки в одном файле ... Если был способ уведомить клиента по электронной почте и т. Д., Что файл не может быть импортирован, вы можете этого не делать. должны сделать столько ручного вмешательства.

1 голос
/ 19 сентября 2009

Глядя на первые несколько байтов, это хорошая идея, но иногда она может привести к ложным выводам.

Я помню, как делал CSV-файл для вставки значений в базу данных MySQL, но сначала открыл его в Excel, чтобы убедиться, что все выглядит хорошо.

Excel сразу же сказал: «Это файл SYLK, вы уверены, что знаете, что делаете?»

Раньше я бы даже не слышал файлов SYLK, но Википедия сказала мне, что это CSV-файл с заголовком, в котором первые символы - "ID".

Возможно, это не имеет никакого отношения к тому, что вы делаете, но я подумал, что могу указать, что магические числа не так волшебны, как могли бы.

1 голос
/ 19 сентября 2009

В системе типа Unix вы бы использовали команду «file» для этого. Интересно, есть ли порт «файла» для Windows? Я не смог найти его в Google, но держу пари, что он доступен где-то на GNU.org ...

Если у вас есть запас типичных «плохих» файлов, было бы довольно легко создать базу данных сигнатур файлов, аналогично тому, что использует «файл».

0 голосов
/ 19 сентября 2009

Вы можете прочитать начало в StreamReader и затем вызвать свойство CurrentEncoding.

http://msdn.microsoft.com/en-us/library/system.io.streamreader.currentencoding.aspx

Обратите внимание, что 100% надежное обнаружение кодирования теоретически невозможно. Однако свойство CurrentEncoding проходит через лучший общий набор эвристик, чтобы сделать правильное предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...