2017-10-19 60 views
0

J'ai quelques types de fichiers texte avec des données telles que des informations sur les produits, des actions, des informations sur les fournisseurs, etc. et ils sont tous structurés différemment. Il n'y a pas d'autre identificateur du type, sauf la structure elle-même (il n'y a pas en-têtes, pas de convention de nom de fichier, etc.)Comment identifier le format de fichier texte par sa structure?

Quelques exemples de ces fichiers:

(produits et stocks)

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

(produits et prix)

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

(produits et fournisseurs - ici N est le séparateur)

03038N92388N9883929 
28338N82367N2837912 
23002N23829N9339211 
... 

(information produit - plusieurs types de lignes)

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

Et plusieurs autres. Je veux créer une fonction qui identifie lequel de ces types est un fichier donné, en utilisant uniquement le contenu. Google n'a été d'aucune aide, en partie parce que je ne sais pas quel terme de recherche utiliser. Inutile de dire que «identifier le type de fichier par contenu/structure» n'est d'aucune aide, il me donne juste des résultats sur la façon de trouver jpgs, pdfs, etc .. Il serait utile de voir un code que d'autres ont écrit . Ce que j'ai pensé jusqu'ici est de faire une classe FileIdentifier pour chaque type, puis quand un fichier est donné, essayez de l'analyser et s'il ne fonctionne pas, passez au type suivant. Mais cela semble être une erreur et je devrais coder beaucoup d'informations. En outre, que se passe-t-il si un autre format vient et est très similaire à l'un des existants, mais a des informations différentes dans les colonnes?

Répondre

1

Il n'y a vraiment pas de solution unique, sauf si vous pouvez limiter les formats de fichiers qui peuvent arriver. Vous ne pourrez toujours trouver une heuristique pour identifier les formats que si vous pouvez demander à celui qui conçoit ces formats de lui donner un identifiant unique ou demander à l'utilisateur quel est le format du fichier. Cela dit, il y a des choses que vous pouvez faire pour améliorer vos résultats, comme vous assurer que vous essayez toutes les instances de formats similaires, puis choisissez le meilleur ajustement au lieu de la première correspondance.

L'approche générale sera toujours la même: faire en sorte que chaque tentative de décodage soit aussi strictement que possible, et avec autant de connaissances sur la syntaxe, mais aussi sur la sémantique. C'est à dire. Si vous savez qu'un élément ne peut contenir qu'une seule des cinq valeurs, ou des nombres dans une certaine plage, utilisez cette connaissance pour la détection. Aussi, n'appelez pas simplement strtol() sur un composant et acceptez-le, vérifiez qu'il a analysé la chaîne entière. Si ce n'est pas le cas, soit échouer là ou maintenir une valeur de «confiance» et réduire cela si un fichier a des parties éventuellement non valides. Puis, à la fin, passez en revue tous les résultats d'analyse et choisissez celui qui a le pourcentage de confiance le plus élevé. Ou si vous ne pouvez pas vous pouvez demander à l'utilisateur de choisir entre les formats les plus probables. PS - L'outil de ligne de commande de fichier sur Unixes fait quelque chose de similaire: Il regarde le début d'un fichier et identifie les séquences communes qui indiquent certains formats de fichiers.