我应该使用正则表达式来解析我的文件,还是有更好的方法?

时间:2011-12-09 00:38:02

标签: php regex mariadb

我有一个超过2000行的文件需要解析。我想确保获得100%准确的结果,然后将其导入我的MariaDB。

该文件如下所示:

line 0: #start#
line 1: 20111211\200000
line 2: n=john|l=smith,131_stree_apt#102_city_state_11111_country,19989989988|17771112222,user%64domain.com,12,21,551|626|23\r
...
line 2156: #end#

所以 第1行是24h格式的日期时间 第2行是行格式:

  • n = name
  • l =姓氏
  • 完整地址
  • 手机+手机
  • 电子邮件
  • 总目标
  • 总票数
  • 在冰上的时间+在板凳上的时间
  • penality minutes

我无法弄清楚正则表达式。我的另一个想法是解析每一行,然后解析每个逗号,然后解析每个管道等,但我认为这种方法比正则表达式慢,而且不太准确。我是对的吗?

3 个答案:

答案 0 :(得分:7)

  

我无法弄清楚正则表达式,所以我的想法是解析每一行,然后解析每个逗号,然后每个管道然后....我认为这是缓慢的,不那么准确,然后regexp

你为什么不去试试呢? 不要让这个讽刺你,大胆。 一般来说,如果我是你,我会做以下事情:

  1. 直截了当地实施
  2. 测试
  3. 调整它
  4. ~2000记录不是那么多,所以甚至可能不需要第三步(特别是如果这是仅运行一次的迁移 - 那么如果需要2分钟呢?)。

    BTW:这是一般的编程建议,适用于很多问题。 Don't optimize prematurely

答案 1 :(得分:2)

编写解析器,它们比正则表达式更强大,更易于编写和推理。

逐个字符地阅读文件,因为每个角色决定你想用它做什么。

最初您正在阅读'日期'然后当您找到换行符时,您知道您已完成解析日期。

然后解析每条记录。首先,你希望看到一个n,你继续阅读,直到你得到一个|,然后你期望l,继续阅读,直到找到,等。 如果您发现某些内容,那么您并不希望知道您的解析器中存在错误,或者数据文件中存在错误。

你永远不会知道你是否完美地阅读了文件,没有100%。只有永远足够好的'。 这是计算机科学中的一般法律

答案 2 :(得分:1)

显然我不会给你完整的密码。但作为占位符回答并展示基本方法:

preg_match('/
   ^
     n=(\w+)       # just alphanumerics
     \|
     l=(\w+)
     ,
     ([\w\h\#]+)    # mixture of letters and space and #
     ,
     ([^,]*)       # anything but commas
     ...
   $
  /x', $line, $match);

它只需要与伪CSV行中的字段一样多的字符类和捕获组。 <{1}}仅用于匹配小数也可能很有用。

使用基本字符串函数编写伪解析器显然不合理,因为正则表达式可以更可靠地执行更少的代码。