2017-10-19 130 views
0

我有幾個文本文件類型的數據,如產品信息,庫存,供應商信息等,他們都是不同的結構。沒有其他的標識符以外的結構本身的類型(沒有標頭,沒有文件名約定等)如何通過其結構來識別文本文件格式?

這些文件的一些例子:

(產品和股票)

2326 | 542212 | Bananas | 00023 | 1 | pack 
2326 | 297875 | Apples  | 00085 | 1 | bag 
2326 | 028371 | Pineapple | 00007 | 1 | can 
... 

(產品和價格)

12556 Meat, pork  0098.57 
58521 Potatoes, mashed 0005.20  
43663 Chicken wings  0009.99 
... 

(產品和供應商 - 這裏N是分隔符)

03038N92388N9883929 
28338N82367N2837912 
23002N23829N9339211 
... 

(產品信息 - 多種類型行)

VIN|Mom & Pops|78 Haley str. 
PIN|BLT Bagel|5.79|FRESH 
LID|0239382|283746 
... (repeats this type of info for different products) 

其他幾人。 我想做一個函數來識別給定文件中的哪些類型,除了內容之外什麼也不用。 Google一直沒有幫助,部分原因是我不知道要使用哪個搜索字詞。不用說,「通過內容/結構來識別文件類型」沒有任何幫助,它只是給了我關於如何查找jpgs,pdf等的結果。如果我看到其他人編寫來處理類似問題的一些代碼會很有幫助。

我到目前爲止的想法是爲每個類型創建一個FileIdentifier類,然後當給定文件時嘗試解析它,如果它不起作用,則轉到下一個類型。但是,這似乎對我來說很容易出錯,而且我必須對很多信息進行硬編碼。另外,如果出現其他格式,並且與任何現有格式非常相似,但列中的信息不同,會發生什麼情況?

回答

1

除非您可以限制可能發生的文件格式,否則確實沒有一個通用的答案。除非您可以獲得設計這些格式的唯一標識符或向用戶詢問該文件的格式,否則您將始終只能找到識別格式的啓發式方法。

也就是說,有些事情可以改善您的結果,比如確保您嘗試所有類似格式的實例,然後選擇最合適的代替第一個匹配項。

一般方法將始終如一:儘可能嚴格地進行每次解碼嘗試,並且儘可能多地瞭解關於語法的知識以及語義。 I. e。如果您知道某個項目只能包含5個值中的一個或某個範圍內的數字,請使用該知識進行檢測。另外,不要只在組件上調用strtol()並接受它,檢查它是否解析了整個字符串。如果沒有,則要麼在那裏失敗,要麼保持「置信度」值,並且如果文件具有任何可能無效的部分,則降低該值。

然後最後,通過所有解析結果並挑選最高置信度百分比的結果。或者,如果你不能,你可以要求用戶選擇最有可能的格式。

PS - Unixes上的文件命令行工具做了類似的事情:它查看文件的開始並識別指示某些文件格式的常見序列。