2017-10-19 7 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は助けにはならなかった。言うまでもなく、「コンテンツ/構造別のファイルタイプを特定する」というのは助けにはならないが、jpgやpdfなどの検索結果を与えるだけである。同様の問題に対処するために他の人が書いたコードを見れば助けになる。

各タイプのFileIdentifierクラスを作成しておき、ファイルを解析すると、それを解析しようとすると次の型に移ります。しかし、それは私にとっては誤りのようです。多くの情報をハードコードする必要があります。また、別のフォーマットが存在し、既存のフォーマットと非常に似ているが、カラムに異なる情報がある場合はどうなりますか?

答えて

1

実際に発生する可能性のあるファイル形式を制限することができない限り、すべての答えが一通りではありません。これらの形式を設計して一意の識別子を与えるか、ユーザーにファイルの形式を尋ねることができない限り、形式を識別するヒューリスティックしか見つけることができません。

しかし、同様のフォーマットのすべてのインスタンスを試してから、最初のマッチの代わりにベストフィットを選ぶように、結果を改善するためにできることがあります。

一般的なアプローチは常に同じです。できるだけ厳密に各デコードの試行を行い、構文だけでなくセマンティクスについても多くの知識を持ちます。 I.アイテムが5つの値のうちの1つ、または特定の範囲内の数字のみを含むことができるとわかっている場合は、検出のための知識を使用します。また、コンポーネントでstrtol()を呼び出してそれを受け入れるだけで、文字列全体を解析したことを確認してください。もしそうでなければ、すぐに失敗するか、または「信頼」値を維持し、ファイルに無効な部分がある場合はそれを下げてください。

最後に、すべての解析結果を確認し、信頼度が最も高いものを選択します。または、できない場合は、最も可能性の高い形式を選択するようユーザーに依頼することができます。

PS - Unixesのファイルコマンドラインツールは、ファイルの先頭を見て特定のファイル形式を示す共通のシーケンスを識別します。

関連する問題