2013-05-21 3 views
0

У меня есть файл, который находится над 400mbPHP, Разбиение большого файла на часть, включающей строку поиск

Это база данных графика, который только распределяется таким образом.

В этом текстовом файле есть строка, которая знаменует начало записи данных.

Эта строка всегда начинается с «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 here

ответ

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); 
+0

"теги для << >> добавлены для вашего понимания, они не существуют в файле." –

+0

обновлено на основе нового понимания – Orangepill

+0

Мне также пришлось бы изменить подстроку от «b» до «BSN», так как есть две строки, начинающиеся с B – Deano

-2

Если у вас есть предопределенная структура данных, которую можно использовать раздвоение команды (UNIX):

split -l 6000 your_big_file.txt data_ 

Этой команда делит большой файл до небольших 6000 строк в каждой (1000 записей данных).

Или, если структура данных неоднородно вы можете использовать Perl один лайнер:

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

Perl может анализировать большие файлы построчно вместо прихлебывая весь файл в память.

Новый файл будет создан для каждой записи данных. Не волнуйтесь, что файловая система Ext4 имеет теоретический предел в 4 миллиарда файлов в каталоге.

После этого можно импортировать все данные в базу данных с помощью PHP-скрипта.

+0

Нет, это не нужно то, что ОП. –

+0

Исходный файл @UltimateProgrammer_BR имеет предопределенную структуру, 6 строк для каждого элемента данных, поэтому самый простой способ разделить файл на куски, а затем обрабатывать небольшие файлы с помощью PHP. –

+0

Извинения, длина записи не упоминалась: она сильно различается. – Deano

Смежные вопросы