简短问题: 如何自动检测CSV文件是否在第一行中包含标题?
详细信息:我编写了一个小型CSV解析引擎,将数据放入一个我可以作为(大约)内存数据库访问的对象.编写原始代码是为了解析具有可预测格式的第三方CSV,但我希望能够更普遍地使用此代码.
我正在尝试找出一种自动检测CSV标头存在的可靠方法,因此脚本可以决定是使用CSV文件的第一行作为键/列名还是立即开始解析数据.由于所有我需要的是一个布尔测试,我可以很容易地检查CSV文件后自己指定参数,但我宁愿没有(去走自动化).
我想我必须解析前3个?CSV文件的行,并查找某种类型的模式以与标头进行比较.我正在做三个特别糟糕的噩梦,其中:
由于某种原因,标题包括数字数据
前几行(或CSV的大部分)为空
标题和数据看起来太相似,无法区分它们
如果我可以获得"最佳猜测"并让解析器失败并出现错误,或者如果无法确定则发出警告,那就没问题.如果在时间或计算方面这将是非常昂贵的事情(花费的时间超过它应该拯救我的时间),我很乐意废弃这个想法,然后回到"重要的事情"上.
我正在使用PHP,但这让我更像是一个算法/计算问题而不是特定于实现的问题.如果有一个我可以使用的简单算法,那很好.如果你能指出一些相关的理论/讨论,那也很棒.如果有一个巨型库可以进行自然语言处理或300种不同的解析,我对此并不感兴趣.
正如其他人所指出的那样,你不能以100%的可靠性做到这一点.在某些情况下,"大部分正确"是有用的,但是 - 例如,具有CSV导入功能的电子表格工具通常会尝试自行解决这个问题.这里有一些启发式指示第一行不是标题:
第一行的列不是字符串或为空
第一行的列并非都是唯一的
第一行似乎包含日期或其他常见数据格式(例如,xx-xx-xx)
从最普遍的意义上讲,这是不可能的.这是一个有效的csv文件:
名字
Jim
Tom
Bill
大多数csv读者只需将hasHeader作为选项,并允许您根据需要传入自己的标题.即使在您认为可以检测到的情况下,即字符标题和数字数据,您也可能遇到灾难性的失败.如果您的专栏是宝马系列列表怎么办?
M
3
5
7
您将错误地处理此问题.最糟糕的是,你将失去最好的车!