我有一个超过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行是行格式:
我无法弄清楚正则表达式。我的另一个想法是解析每一行,然后解析每个逗号,然后解析每个管道等,但我认为这种方法比正则表达式慢,而且不太准确。我是对的吗?
答案 0 :(得分:7)
我无法弄清楚正则表达式,所以我的想法是解析每一行,然后解析每个逗号,然后每个管道然后....我认为这是缓慢的,不那么准确,然后regexp
你为什么不去试试呢? 不要让这个讽刺你,大胆。 一般来说,如果我是你,我会做以下事情:
~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}}仅用于匹配小数也可能很有用。
使用基本字符串函数编写伪解析器显然不合理,因为正则表达式可以更可靠地执行更少的代码。