我有一些文本文件类型包含产品信息,库存,供应商信息等数据,并且它们的结构都不同。除了结构本身之外没有其他类型的标识符(没有标题,没有文件名约定等)。
这些文件的一些示例:
(产品和库存)
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类,然后在给定文件时尝试解析它,如果它没有工作则转到下一个类型。但这似乎很容易让我感到错误,我不得不对很多信息进行硬编码。此外,如果另一种格式出现并且与任何现有格式非常相似,但列中的信息不同,会发生什么?
答案 0 :(得分:1)
除非您可以限制可能发生的文件格式,否则确实没有一个通用的答案。您将始终只能找到用于识别格式的启发式方法,除非您可以让设计这些格式的人为其提供唯一标识符,或者询问用户该文件的格式。
也就是说,你可以采取一些措施来改善你的结果,例如确保你尝试所有相似格式的实例,然后选择最合适的而不是第一场比赛。
一般方法将始终如一:尽可能严格地进行每次解码尝试,并且不仅要了解语法,还要了解语义。 I. e。如果您知道某个项目只能包含5个值中的一个或某个范围内的数字,请使用该知识进行检测。此外,不要只调用组件上的strtol()并接受它,检查它是否解析了整个字符串。如果没有,则要么失败,要么保持“置信度”值,如果文件中有任何可能无效的部分,则降低值。
然后最后,浏览所有解析结果并选择具有最高置信度百分比的结果。或者,如果你不能,你可以要求用户在最可能的格式之间进行选择。
PS - Unix上的文件命令行工具做了类似的事情:它查看文件的开头并识别指示某些文件格式的常用序列。