0

我的客户订单有一个非常大的 .txt 文件,我需要将它移动到 mysql 数据库中。但是我不知道要使用什么样的正则表达式,因为信息并没有太大的不同。

----------------------
4046904


KKKKKKKKKK
劳拉·迈耶
万通人寿保险
瓦德奈街 153 号

马萨诸塞州奇科皮 01020
我们
413-744-5452
lmeyer@massmutual.co...


KKKKKKKKKK
373074210772222 02/12 6213 不适用
----------------------
4046907


KKKKKKKKKK
文卡特塔拉迪维杜拉

西 68 街 6105 号

塔尔萨,OK 74131
我们
9184472611
venkat.talladivedula...


KKKKKKKKKK
373022121440000 06/11 9344 不适用
----------------------

我尝试了一些东西,但我什至无法提取名称......这是我努力的一个样本,但没有成功

$htmlContent = file_get_contents("orders.txt");

//print_r($htmlContent);

$pattern = "/KKKKKKKKKKK(.*)\n/s";
preg_match_all($pattern, $htmlContent, $matches);
print_r($matches);
$name = $matches[1][0];
回声$名称;

4

4 回答 4

4

您可能希望避免使用这样的正则表达式。由于数据清楚地按行组织,因此您可以使用 fgets() 重复读取行并以这种方式解析数据。

于 2010-10-24T22:57:52.787 回答
0

您可以使用正则表达式读取此文件,但创建一个可以读取所有字段的正则表达式可能会非常复杂。

我建议您逐行阅读此文件,并解析每个文件,检测其中包含哪种数据。

于 2010-10-24T23:01:04.680 回答
0

正如您确切知道您的数据在哪里(即它在哪一行),为什么不直接获取它呢?

即类似的东西

$htmlContent = file_get_contents("orders.txt");

$arrayofclients = explode("-----------------------",$htmlContent);
$newlinesep = "\r\n";
for($i = 0;i < count($arrayofclients);$i++)
{
$temp = explode($newlinesep,$arrayofclients[i]);
$idnum = $temp[0];
$name = $temp[4];
$houseandstreet = $temp[6];
//etc
}

或者简单地使用 fgets() 逐行读取文件 - 例如:

$i = 0;$j = 0;
$file = fopen("orders.txt","r");
$clients = [];
while ($line = fgets($ffile) )
{
    if(line != false)
    {
        $i++;
        switch($i)
        {
        case 2:
            $clients[$j]["idnum"] = $line;
            break;
        case 6:
            $clients[$j]["name"] = $line;
            break;
        //add more cases here for each line up to:
        case 18:
            $j++;
            $i = 0;
            break;
        //there are 18 lines per client if i counted right, so increment $j and reset $i.
        }
    }
}
fclose ($f);

您可以使用正则表达式,但在这种情况下它们有点尴尬。

尼科

于 2010-10-24T23:10:25.870 回答
0

作为记录,这是将为您捕获名称的正则表达式。(授予的速度很好可能是一个问题。)

(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)

解释:

(?<=K{10}\s{2})  #Positive lookbehind for KKKKKKKKKK then 2 return/newline characters
\K[^\r\n]++      #Greedily match 1 or more non-return/newline characters
(?!\s{2}-)       #Negative lookahead for return/newline character then dash

这是一个正则表达式演示

您会注意到我的正则表达式模式在 Regex Demo 和我的 PHP Demo 之间略有不同。可能需要根据环境进行轻微调整以匹配返回/换行符。

这是 php 实现(Demo):

if(preg_match_all("/(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)/",$htmlContent,$matches)){
    var_export($matches[0]);   
}else{
    echo "no matches";
}

通过\K在我的模式中使用,我避免了实际上必须用括号捕获。这将数组大小减少了 50%,对于许多项目来说是一个有用的技巧。基本上说“\K从这一点开始全字符串匹配”,因此匹配进入第一个子数组(fullstrings,key = 0),$matches而不是生成全字符串匹配0和捕获1

输出:

array (
  0 => 'Laura Meyer',
  1 => 'Venkat Talladivedula',
)
于 2017-05-03T14:10:39.730 回答