【问题标题】:fast auto-guessing of date strings快速自动猜测日期字符串
【发布时间】:2011-03-17 20:36:53
【问题描述】:

对于来自不同来源的大量巨大 csv 文件(100M 行以上),我需要一个快速的 sn-p 或库来自动猜测日期格式并将其转换为分解时间或 unix 时间戳。一旦成功猜出,sn-p 必须能够检查随后出现的日期字段的有效性,因为日期格式可能会在整个文件中发生变化。

日期格式的测试集必须是可变的,但编译一个最佳决策树或从许多给定日期格式中的东西是可以的。

我得出的结论是,不存在这样的东西,但还必须进行“市场调查”,因此我的问题是。

我的第一次尝试是为迄今为止我观察到的 23 种不同的日期格式模拟 getdate(),并通过考虑日期特定特征的优化版本替换数字解析器(没有 '4' 到 '9' 在天部分的天数,月份部分的天数中没有'3'到'9'等)

有没有人遇到过类似的问题,甚至编写过类似的代码?

【问题讨论】:

  • 每个 CSV 文件是否只有一种日期格式,还是混合使用?
  • 通常每个文件只有一种格式,但有时他们会更改整个文件的格式,这可能是把东西放在一起的结果。您经常会看到前 9800 万行成功导入数据库,然后接下来的 4000 万行完全无用。
  • 如果你有特定的日期格式会有点困难。 “060804”是 2004 年 6 月 8 日、2004 年 8 月 6 日(欧洲)还是 2006 年 8 月 4 日(yymmdd)?你可能没有这样的格式,但如果你有,你将不得不选择,你可能会发现你选择不正确。如果这是一个持续的负载,请查看您是否可以返回源并让他们修复它。如果这是一次性的事情,你将不得不蒙混过关。
  • 是的,谢谢,忘了详细说明。仅从一行中就很难自动猜测日期字符串。但输入源(1/2 级报价数据)的特殊性质允许您根据数百万行进行有根据的猜测,因为数据按时间顺序排列并且至少涵盖一年。
  • 我认为我要做的第一件事是查看您的 23 种日期格式列表是否对于更大的样本是完整的,一个尽可能具有代表性的样本。一般情况下的问题是无法解决的,因此您必须调整到您的实际来源。我会担心在日期格式之间切换的文件:它们也会以其他方式被破坏吗?

标签: c string date parsing format


【解决方案1】:

我使用 Perl 脚本处理了来自众多来源的超过 50 种格式的带时间戳的传感器数据(结构为 CSV)。从不限制功能,虽然它是基于脚本的,但它相当快(>10Klines/sec,其中行约为 60-100chars) 我实施了 a)分析前几百行,倒带然后运行 ...为决策逻辑建立上下文。 b) 发出带有行号和上下文的错误行 ...所以在运行结束时可以编辑有问题的行,然后将它们设置为在后续运行中重新插入,这样它就可以无错误地传递“修补”错误,即每一行都会匹配一种格式。 c) 线路之间的时间差 ...只允许增加时间戳。 d) 我也可以重新格式化其他的东西,比如改变单位,即英制到 SI。 虽然来自 C 阵营,简单的 Perl 并不算太陌生,但让它变得如此简单 注意 如果文件中有足够的信息,此方法可以处理 10/04/05 即 DD/MM/YY 或 MM/DD/YY 等问题

【讨论】:

  • 不错,介意分享您的代码吗? 10k 行/秒大致是我的想法。我启动了一个简单的编译器,它最多需要 64 个格式规范并发出代码来进行增量优化,所以最后我得到了一个位掩码,其中一个设置位表示相应的格式规范确实在整个文件中保持不变。可以用你的代码来验证我的。
  • 如果你给我一页测试数据,我可以敲一个演示器,只是为了让你在学习曲线上更轻松。您可能需要复习一下您的正则表达式,因为它用于选择您想要的数据。
  • 我选择了 6 个来源,每个来源 10000 行。 qaos.math.tu-berlin.de/~freundt/for_roaker.tar.bz2
【解决方案2】:

经过两周过度的 googl^Wweb 浏览后,我得出结论,我必须自己写这个。 FTW,我第一次尝试:http://github.com/hroptatyr/glod

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 2012-03-19
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多