自动检测文件中是否存在 CSV 标头

2022-08-30 17:14:00

简短的问题:如何自动检测 CSV 文件的第一行中是否有标题?

详细信息:我编写了一个小型 CSV 解析引擎,该引擎将数据放入一个对象中,我可以将其作为(大约)内存中数据库进行访问。原始代码是为了使用可预测的格式解析第三方CSV而编写的,但我希望能够更广泛地使用此代码。

我正在尝试找出一种可靠的方法来自动检测CSV标头的存在,因此脚本可以决定是使用CSV文件的第一行作为键/列名称还是立即开始解析数据。由于我所需要的只是一个布尔测试,我可以在自己检查CSV文件后轻松指定一个参数,但我宁愿不必这样做(去自动化)。

我想我必须将前3个解析为?行的 CSV 文件,并查找某种模式以与标头进行比较。我正在做三个特别糟糕的案例的噩梦,其中:

  1. 由于某种原因,标头包含数字数据
  2. 前几行(或 CSV 的大部分)为空
  3. 标头和数据看起来太相似,无法区分它们

如果我能得到一个“最佳猜测”,并让解析器失败并出现错误,或者如果它无法决定,就发出警告,那没关系。如果这在时间或计算方面会非常昂贵(并且花费的时间比它应该节省我的时间要多),我会很乐意放弃这个想法,回到“重要的事情”上。

我正在使用PHP,但这对我来说更像是一个算法/计算问题,而不是特定于实现的问题。如果有一个简单的算法我可以使用,那就太好了。如果你能给我指出一些相关的理论/讨论,那也很棒。如果有一个巨大的库可以进行自然语言处理或300种不同类型的解析,我对此不感兴趣。


答案 1

正如其他人所指出的那样,您无法以100%的可靠性做到这一点。但是,在某些情况下,“大部分正确”是有用的 - 例如,具有CSV导入功能的电子表格工具经常尝试自己解决这个问题。以下是一些启发式方法,这些启发式方法倾向于表明第一行不是标头:

  • 第一行包含非字符串或为空的列
  • 第一行的列并非都是唯一的
  • 第一行似乎包含日期或其他常见的数据格式(例如,xx-xx-xx)

答案 2

从最一般的意义上讲,这是不可能的。这是一个有效的 csv 文件:
名称
吉姆·
汤姆
·比尔

大多数csv阅读器只会将hasHeader作为一个选项,并允许您根据需要传入自己的标题。即使在您认为可以检测到的情况下,即字符标头和数字数据,也可能遇到灾难性的故障。如果您的列是宝马系列的列表怎么办?
手机
3
5
7

您将错误地处理此内容。最糟糕的是,你会失去最好的车!


推荐