如何通过其结构识别文本文件格式?

时间:2017-10-19 06:56:36

标签: parsing format structure text-files

我有一些文本文件类型包含产品信息,库存,供应商信息等数据,并且它们的结构都不同。除了结构本身之外没有其他类型的标识符(没有标题,没有文件名约定等)。

这些文件的一些示例:

(产品和库存)

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)

还有其他几个人。 我想创建一个函数来识别给定文件中的哪些类型,只使用内容。谷歌一直没有帮助,部分原因是因为我不知道要使用哪个搜索词。不用说,"按内容/结构识别文件类型"没有任何帮助,它只是给了我如何找到jpgs,pdfs等的结果。如果我看到其他人编写的代码处理类似的问题会有所帮助。

到目前为止,我所想的是为每种类型创建一个FileIdentifier类,然后在给定文件时尝试解析它,如果它没有工作则转到下一个类型。但这似乎很容易让我感到错误,我不得不对很多信息进行硬编码。此外,如果另一种格式出现并且与任何现有格式非常相似,但列中的信息不同,会发生什么?

1 个答案:

答案 0 :(得分:1)

除非您可以限制可能发生的文件格式,否则确实没有一个通用的答案。您将始终只能找到用于识别格式的启发式方法,除非您可以让设计这些格式的人为其提供唯一标识符,或者询问用户该文件的格式。

也就是说,你可以采取一些措施来改善你的结果,例如确保你尝试所有相似格式的实例,然后选择最合适的而不是第一场比赛。

一般方法将始终如一:尽可能严格地进行每次解码尝试,并且不仅要了解语法,还要了解语义。 I. e。如果您知道某个项目只能包含5个值中的一个或某个范围内的数字,请使用该知识进行检测。此外,不要只调用组件上的strtol()并接受它,检查它是否解析了整个字符串。如果没有,则要么失败,要么保持“置信度”值,如果文件中有任何可能无效的部分,则降低值。

然后最后,浏览所有解析结果并选择具有最高置信度百分比的结果。或者,如果你不能,你可以要求用户在最可能的格式之间进行选择。

PS - Unix上的文件命令行工具做了类似的事情:它查看文件的开头并识别指示某些文件格式的常用序列。