我的文件超过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
读取该文件答案 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脚本将所有数据导入数据库。