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


How do I split a delimited file without /n?

我有这个数据:

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数据库中?

您可以使用preg_split而不是explode来拆分由要使用的分隔符之一组成的正则表达式:

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

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


或者,正如Ignacio所评论的,使用fgets逐行读取文件。

<?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,简单得多。