我有一个用PHP编写的web应用程序,需要解析数据文件。它使用preg_replace删除文件顶部的任何列标题等,然后逐行循环遍历文件的其余部分,使用preg_match提取每行上的相关值。
文件格式如下:
Column heading 1 Column heading 2 Column heading 3 Column heading 4
0.000000000E+0000 0.000000000E+0000 0.000000000E+0000 0.000000000E+0000
0.000000000E+0000 0.000000000E+0000 0.000000000E+0000 0.000000000E+0000
0.000000000E+0000 0.000000000E+0000 0.000000000E+0000 0.000000000E+0000
0.000000000E+0000 0.000000000E+0000 0.000000000E+0000 0.000000000E+0000
0.000000000E+0000 0.000000000E+0000 0.000000000E+0000 0.000000000E+0000
文件中最多可能有10,000行数据。我刚刚有一个客户问我是否只能匹配最后一行数据,而不是从每一行获取数据。
因此,我需要一个正则表达式来删除列标题和每一行数据,除了最后一行。下面是我使用的代码:
$startsWith = "/^Column heading 1 Column heading 2 Column heading 3 Column heading 4'r'n( [0-9]{1}'.[0-9]{9}E['+-][0-9]{4} [0-9]{1}'.[0-9]{9}E['+-][0-9]{4} [0-9]{1}'.[0-9]{9}E['+-][0-9]{4} [0-9]{1}'.[0-9]{9}E['+-][0-9]{4} 'r'n(?!$))*/s";
$str = preg_replace($startsWith,'',$str);
这应该只留下最后一行数据。如果我通过命令行PHP运行脚本,这绝对没问题。然而,如果我通过浏览器运行它,我没有从服务器得到响应-只是一个空白页面。
我已经看到了这个问题:RegExp在preg_match函数返回浏览器错误
但是它并没有真正的帮助,因为降低pcre.recursion_limit
只会导致regex根本不工作,并返回PREG_RECURSION_LIMIT_ERROR
错误。
是否有一个更有效的方法,使用正则表达式,修剪一切除了最后一行数据在一个大文件?或者我可以调整一些设置使其通过Apache工作?
<标题> 更新谢谢大家的建议,但是,由于系统的构建方式,我需要使用正则表达式。对于解析这个特定的文件,我知道这不是理想的方法,但是对于其他文件类型,这是唯一的方法。该系统是为解析许多非常奇怪的文件类型而构建的,而正则表达式是实现这一目标的唯一方法。我提供的正则表达式工作时,通过PHP CLI运行,但不是通过网页-是否有一个更有效的正则表达式或一些设置,我可以改变,使其通过Apache工作?
标题>以换行符分隔字符串,得到最后一行:
$lines = explode("'n", $str);
$last_line = array_pop($lines);
我建议使用fseek,因为首先完全加载10000行文件确实是cpu和时间密集型的:
$fp = fopen("file.txt", "r");
$pos = -1;
$t = " ";
while ($t != "'n") {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos = $pos - 1;
}
$t = fgets($fp);
fclose($fp);
return $t;
来源:http://forums.devshed.com/php -发展- 5/php快速-方式-读- -线- 156010. - html