2009-09-18 49 views
2

我有一個日期導入項目,客戶端發送ANSI-latin1編碼文件(iso-8859-1)。然而......似乎每週我們都會得到一個驚喜檔案,這個檔案格式不正確,導入基本上死得可怕,需要人工干預才能恢復並繼續......最常見的壞檔案格式似乎是excel,壓縮文件或XML/HTML文件...如何檢測文件不是ANSI-Latin1?

因此,爲了減輕人爲干預,我想合理確定是否我們有一個強大的ANSI候選文件,然後再試圖通過每一行該文件尋找64個壞字符中的一個,然後對整個行或文件在發現錯誤字符數量方面是否錯誤進行了深入分析...

我在考慮可能正在製作Unicode/UTF檢查和/或魔法數字檢查或晚上試圖檢查一些特定的應用程序類型..該文件s沒有文件擴展名,因此任何檢查都將通過檢查內容和任何快速排除文件的方式來完成,因爲導入過程需要每秒處理100-500條記錄。

注:超過100個不同類型的壞文件已發送給我們,包括圖像和PDF文件。所以,有一個關於是否可以方便快捷地排除LTOS不同的非ANSI類型的,而不僅僅是幾個專門針對關注...

回答

5

鑑於你們的榜樣「壞」的文件類型,我會說把串聯快速檢查文件的前幾個字節:

  • 是UTF-16 BOM嗎?
  • 它是 「<html」 或 「<!DOCTYPE」?
  • 它是 「<xml」?
  • 它有NUL角色嗎?
  • 是吧`PK \ 003 \ 004' (zip文件頭?)
  • 是它(無論Excel文件開始,你就必須尋找一個高達8)
+0

+1不錯的答案。 – 2009-09-18 22:19:59

+0

上一年收到的錯誤文件類型的實際列表超過了100. 由於傳統的ghost腳本實現,NUL是ANSI-latin1實現中的允許字符。 我一直在閱讀了對UTF BOM的,但如果我正確地理解他們,他們很少使用... 愛其他檢查的建議,雖然我wodner我多少壓縮頭會檢查覆蓋最常用的? – Shire 2009-09-18 22:22:36

+1

也可能要檢查第一行是否會導入/看起來像你的文件類型。 – 2009-09-18 22:24:23

2

我像RichieHindle的回答非常好。您還應該查看導入中的錯誤處理。如果遇到錯誤的文件捕獲錯誤,請記錄並繼續。您不應該停止導入其他文件,或者由於一個文件中的一個錯誤而導致其他客戶的導入更糟......如果有通過電子郵件等方式通知客戶的文件無法導入的方法,您可能不會導入必須做盡可能多的人工干預。

+0

上個月剛剛開始爲該公司工作並突然繼承了此程序。我的工作是大大改善用戶體驗。 ;)我也一直在看神奇的數字,並想知道是否有一個庫可用,可以檢測這些可靠,沒有誤報... – Shire 2009-09-18 22:27:02

1

在Unix類系統,你會使用「文件」命令這一點。我不知道是否有一個Windows的「文件」端口?我在Google找不到一個,但我敢打賭,它可以在GNU.org某處...

如果你碰巧有一堆典型的「壞」文件,它會很容易構建文件簽名的數據庫,類似於「文件」使用的數據庫。

1

看前面的幾個字節是個好主意,但有時候會導致錯誤的結論。

我記得做一個CSV文件插入MySQL數據庫的值,但我先用Excel打開它,檢查一切看起來不錯。

的Excel馬上說:「這是一個SYLK文件,你確定你知道你在做什麼?「

我從來沒有聽說過SYLK的之前的文件,但維基百科告訴我,這是一個CSV一個頭,其中的第一個字符是‘ID’,文件。

這可能沒有對於你正在做的事情有什麼影響,但是我想我會指出幻數並不像它們可能的那樣神奇。