PHP,将大文件拆分为包含字符串搜索的部分

时间:2013-05-21 16:22:16

标签: php

我的文件超过400Mb

这是一个时间表数据库,只能以这种方式分发。

在此文本文件中有一个标记数据记录开头的字符串。

此字符串始终以“BSN”开头,同样有一个标记该字符串的字符串 始终以“LT”开头的数据记录的结尾

我想要解决的是如何将数据文件切割成包含1000的块 数据记录。然后,当这个循环完成后,我可以按顺序导入这些文件。

创建的文件必须在新文件夹中按顺序编号...

[edit]记录集的长度变化很大[/ edit]

以下是其中一组的样本:

BSNC031551112111206240000001   << DATA RECORD START >> 
BX         EMYEM129000                                                           
LOSHEFFLD 2235 2235                                                
LIDORESNJ                                              
LISPDN                                       
LTDRBY    2326 23266           << DATA RECORD END >>                                        
BSNC033501112111205130000001   << NEXT RECORD >>
BX         EMYEM118600    

*&lt;&lt; &GT;&GT;标签是为了您的理解而添加的,它们不存在于文件中。

我目前使用PHP fopen / fgets方法here

读取该文件

2 个答案:

答案 0 :(得分:1)

这样的事情对你有用

$fp = fopen($bigfile, "r");

$file_num = 1;
$prefix = "FILE_";
$suffix = ".DAT";
$buff = "";
$recNo = 0;
while ($rec = fgets($fp)){
    if (substr($rec, 0,3) == 'BSN'){
        $recNo++;
    }

    if ($recNo == 1000){
        // reset record counter
        $recNo = 1;
        // flush out the file
        file_put_contents($prefix.$file_num.$suffix, $buff);
        // clear the buffer
        $buff = "";
        // increment the file counter
        $file_num++;
    }
    // add to the buffer
    $buff.= $rec;
}
fclose($fp);

// flush the remainder
if ($buff) file_put_contents($prefix.$file_num.$suffix, $buff);

答案 1 :(得分:-2)

如果您有预定义的数据结构,则可以使用split命令(unix):

 split -l 6000 your_big_file.txt data_

此命令将大文件分成每个小的6000个字符串(1000个数据记录)。

或者,如果数据结构不均匀,您可以使用perl one liner:

perl -n -e '/^BSNC/ and open FH, ">output_".$n++; print FH;' your_big_file

Perl可以逐行解析大文件,而不是将整个文件压入内存。

将为每个数据记录创建新文件。不用担心Ext4文件系统每个目录的理论上限为40亿个文件。

在此之后,可以使用PHP脚本将所有数据导入数据库。