0

我有一个超过 400Mb 的文件

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

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

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

我试图理解的是如何将数据文件分成包含 1000 条数据记录的块。然后当这个循环完成时,我可以按顺序导入这些文件。

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

[编辑] 记录集的长度差异很大 [/编辑]

以下是其中一组的示例:

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

* << >> 标签是为了您的理解而添加的,它们在文件中不存在。

我目前在这里使用 PHP fopen / fgets 方法读取文件

4

2 回答 2

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);
于 2013-05-21T16:51:30.110 回答
-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 脚本将所有数据导入数据库。

于 2013-05-21T16:27:32.523 回答