3

我有一个需要解析的超过 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 行是 24 小时格式的日期时间第 2 行是行格式:

  • n = 名称
  • l = 姓氏
  • 完整地址
  • 电话+手机
  • 电子邮件
  • 总目标
  • 总通行证
  • 冰上时间+板凳时间
  • 罚则

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

4

3 回答 3

7

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

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

  1. 做一个简单的实现
  2. 测试一下
  3. 调整它

约 2000 条记录并不算多,因此甚至可能不需要第三步(特别是如果这是一次只运行一次的迁移——那如果需要 2 分钟呢?)。

顺便说一句:这是一般的编程建议,确实适用于很多问题。不要过早优化

于 2011-12-09T00:52:38.020 回答
2

编写一个解析器,它们比正则表达式更强大,并且更容易编写和推理。

逐个字符读取文件,为每个字符决定你想用它做什么。

最初您正在阅读“日期”,然后当您找到换行符时,您就知道您已经完成了对日期的解析。

然后解析每条记录。首先,您希望看到 an n,继续阅读直到得到 a |,然后您期待 an l,继续阅读直到找到 a,等。如果您发现了您没想到的东西,您知道解析器中存在错误,或者存在数据文件中的错误。

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

于 2011-12-09T00:43:37.533 回答
1

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

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

它只需要与伪 CSV 行中的字段一样多的字符类和捕获组。\d+仅匹配小数也可能有用。

在这里使用基本的字符串函数来编写一个假解析器显然是不明智的,因为正则表达式可以用更少的代码更可靠地做到这一点。

于 2011-12-09T00:56:58.330 回答