如何在没有/ n的情况下拆分分隔文件?

时间:2012-09-03 02:48:15

标签: php parsing fopen

我有这些数据:

920-1063-03@0001D92E@2012-07-02 920-1063-04@00002F5F@2012-07-02 920-1063-04@00002453@2012-07-02 920-1063-03@0001D256@2012-07-02 920-1063-03@0001E225@2012-07-02 920-1063-03@0001E3C1@2012-07-02 920-1063-04@00001EA6@2012-07-02 920-1063-03@0001D316@2012-07-02 920-1063-04@00002A41@2012-07-02 920-1063-04@00001ADA@2012-07-02 920-1063-04@00002DFD@2012-07-02 920-1063-03@0001C595@2012-07-02 920-1063-04@00001C24@2012-07-02 920-1063-04@00002341@2012-07-02 920-1063-04@00001645@2012-07-02 920-1063-04@00001C04@2012-07-02

我试图以@符号分隔。

要做到这一点,我有这个代码:

<?php
    $filename = "tru_cage_DSB_sn";
    $fd = fopen ($filename, "r");
    $contents = fread ($fd,filesize ($filename));

    fclose ($fd); 
    $delimiter = "@";
    $splitcontents = explode($delimiter, $contents);
    $counter = "";
    foreach ( $splitcontents as $color ){ 
    $counter = $counter+1;
    echo "<b>Split $counter: </b> $color<br>";
    }
?>

输出将如下:

Split 1: 920-1063-03
Split 2: 0001D92E
Split 3: 2012-07-02 920-1063-04
Split 4: 00002F5F
Split 5: 2012-07-02 920-1063-04

但是,我希望拆分也将2012-07-02 920-1063-04分成两个字符串,由空格分隔。那么输出应该是这样的吗?

Split 1: 920-1063-03
Split 2: 0001D92E
Split 3: 2012-07-02
Split 4: 920-1063-04
Split 5: 00002F5F
Split 6: 2012-07-02
Split 7: 920-1063-04

如何进一步拆分?

或者,有没有办法直接将这些数据插入到具有3列的mySQL数据库中?

2 个答案:

答案 0 :(得分:2)

您可以使用preg_split代替explode来拆分包含您要使用的分隔符的正则表达式:

$delimiter = "/@| /";
$splitcontents = preg_split($delimiter, $contents);

此外,您可能应该将$counter初始化为0而不是空字符串。


或者,作为Ignacio commented,使用fgets逐行阅读文件。

答案 1 :(得分:1)

<?php

$text = '920-1063-03@0001D92E@2012-07-02 920-1063-04@00002F5F@2012-07-02 920-1063-04@00002453@2012-07-02 920-1063-03@0001D256@2012-07-02 920-1063-03@0001E225@2012-07-02 920-1063-03@0001E3C1@2012-07-02 920-1063-04@00001EA6@2012-07-02 920-1063-03@0001D316@2012-07-02 920-1063-04@00002A41@2012-07-02 920-1063-04@00001ADA@2012-07-02 920-1063-04@00002DFD@2012-07-02 920-1063-03@0001C595@2012-07-02 920-1063-04@00001C24@2012-07-02 920-1063-04@00002341@2012-07-02 920-1063-04@00001645@2012-07-02 920-1063-04@00001C04@2012-07-02';

$matches = preg_split('#[@\s]#msi', $text);

if (count($matches)) {
    $counter = 0;
    foreach ( $matches as $color ){ 
        $counter = $counter++;
        echo "<strong>Split $counter: </strong> $color<br/>\n";
    }
}

?>

输出:

<strong>Split 1: </strong> 920-1063-03<br/>
<strong>Split 2: </strong> 0001D92E<br/>
<strong>Split 3: </strong> 2012-07-02 <br/>
<strong>Split 4: </strong> 920-1063-04<br/>
<strong>Split 5: </strong> 00002F5F<br/>
编辑:我使用了preg_split作为马特提到的,更简单。