Разбиение одного файла на несколько файлов

12
Unlock
На сайте с 01.08.2004
Offline
786
796

Сложно словами объяснить, поэтому сначала пример файла:


-ISIS- 11110720122D

11 12 0 0 0 0 0 0 0 0999 V2000
1.4208 -0.0042 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0
0.5042 0.4000 0.0000 C 0 0 3 0 0 0 0 0 0 0 0 0
-0.3583 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0875 0.7375 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2250 0.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3583 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6083 1.3958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.5875 1.6042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2250 -1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.0917 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.0917 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2 1 1 0 0 0 0
3 2 1 0 0 0 0
4 1 1 0 0 0 0
5 3 1 0 0 0 0
6 3 2 0 0 0 0
7 2 1 0 0 0 0
8 4 1 0 0 0 0
9 6 1 0 0 0 0
10 5 2 0 0 0 0
11 9 2 0 0 0 0
7 8 1 0 0 0 0
11 10 1 0 0 0 0
M END
> <MOL_ID> (1)
1

> <Cas> (1)
1006-64-0

$$$$

-ISIS- 11110720122D

13 14 0 0 0 0 0 0 0 0999 V2000
-2.2875 -0.0042 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0
-0.5083 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3750 0.4000 0.0000 C 0 0 3 0 0 0 0 0 0 0 0 0
0.3583 0.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.5083 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2208 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2208 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3583 -1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0875 -1.6000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
-2.9583 0.7375 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4792 1.3958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.9542 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.4583 1.6042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2 3 1 0 0 0 0
3 1 1 0 0 0 0
4 2 1 0 0 0 0
5 2 2 0 0 0 0
6 8 2 0 0 0 0
7 4 2 0 0 0 0
8 5 1 0 0 0 0
9 6 1 0 0 0 0
10 1 1 0 0 0 0
11 3 1 0 0 0 0
12 9 1 0 0 0 0
13 10 1 0 0 0 0
11 13 1 0 0 0 0
6 7 1 0 0 0 0
M END
> <MOL_ID> (2)
2

$$$$

его надо разбить на два файла с таким содержимым:


-ISIS- 11110720122D

11 12 0 0 0 0 0 0 0 0999 V2000
1.4208 -0.0042 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0
0.5042 0.4000 0.0000 C 0 0 3 0 0 0 0 0 0 0 0 0
-0.3583 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0875 0.7375 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2250 0.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.3583 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6083 1.3958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.5875 1.6042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.2250 -1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.0917 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.0917 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2 1 1 0 0 0 0
3 2 1 0 0 0 0
4 1 1 0 0 0 0
5 3 1 0 0 0 0
6 3 2 0 0 0 0
7 2 1 0 0 0 0
8 4 1 0 0 0 0
9 6 1 0 0 0 0
10 5 2 0 0 0 0
11 9 2 0 0 0 0
7 8 1 0 0 0 0
11 10 1 0 0 0 0
M END
> <MOL_ID> (1)
1

> <Cas> (1)
1006-64-0

$$$$

и второй файл:


-ISIS- 11110720122D

13 14 0 0 0 0 0 0 0 0999 V2000
-2.2875 -0.0042 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0
-0.5083 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.3750 0.4000 0.0000 C 0 0 3 0 0 0 0 0 0 0 0 0
0.3583 0.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.5083 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2208 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.2208 -0.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.3583 -1.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0875 -1.6000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
-2.9583 0.7375 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.4792 1.3958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.9542 -1.1000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.4583 1.6042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2 3 1 0 0 0 0
3 1 1 0 0 0 0
4 2 1 0 0 0 0
5 2 2 0 0 0 0
6 8 2 0 0 0 0
7 4 2 0 0 0 0
8 5 1 0 0 0 0
9 6 1 0 0 0 0
10 1 1 0 0 0 0
11 3 1 0 0 0 0
12 9 1 0 0 0 0
13 10 1 0 0 0 0
11 13 1 0 0 0 0
6 7 1 0 0 0 0
M END
> <MOL_ID> (2)
2

$$$$

Понятно что проблем с разбиением двух записей нет, но у меня несколько тысяч подобных записей в одном файле. Причем надо чтобы названием файла строилось по маске данные из поля <MOL_ID>.sdf т.е. в данном случае два файла 1.sdf и 2.sdf

Реально ли такое средствами PHP реализовать?

Есть желание, - тысяча способов; нет желания, - тысяча поводов! /Петр-I/.
Polimer
На сайте с 01.09.2006
Offline
84
#1

Unlock, регуларками не пробовали? (если, конечно, не сильные ограничения по ресурсам и времени работы скрипта)

Сейчас прикину, может быть все не так сложно.

Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.
Unlock
На сайте с 01.08.2004
Offline
786
#2

Тут скорее всего и нужно регулярными выражениями, но надо учесть что признак окончания записи $$$$ ибо количество данных для одной записи может меняться, как в примере. Для первой записи есть

> <Cas> (1)

1006-64-0

а для второй нет. А по ресурсам никаких ограничений нет.

Polimer
На сайте с 01.09.2006
Offline
84
#3

ща, 15 минут.

только вопрос, строка: " -ISIS- 11110720122D" каждый раз одиннаковая или числа меняются?

___update

хотя, черт с ней, здесь от этих чисел не зависит вывод

S
На сайте с 13.07.2007
Offline
56
#4

Ужоззззззз :(

preg_match_all("'$$$$$'si", $file, $matches);

print $matches[0][0];

S
На сайте с 13.07.2007
Offline
56
#5

Да же explode использовать можно :)

Unlock
На сайте с 01.08.2004
Offline
786
#6

solnikolay, Ваш пост совсем не понял, я от PHP очень далек, мне ничего не говорит то, что Вы написали.

P.S. Polimer, на всякий случай, цифры могут быть разными.

Shtogrin
На сайте с 02.11.2006
Offline
95
#7

<?php
$data=file_get_contents("file.txt");
if(preg_match_all('|(.*)\$\$\$\$|sU',$data,$part,PREG_SET_ORDER)==0)
die('error [1]');
foreach($part as $k=>$v)
{
$v[1]=trim($v[1]);
if(empty($v[1]))
continue;
if(preg_match('|<MOL_ID> \((.*)\)|U',$v[1],$numb)==0)
die('error [2]');
file_put_contents($numb[1].'.sdf',$v[1]);
echo $numb[1]."\n\n";
}
?>

входной файл - "file.txt"

результат в этом же каталоге - 1.sdf и 2.sdf (без строк $$$$ в конце)

PHP5 или заменить file_put_contents

www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
S
На сайте с 13.07.2007
Offline
56
#8

$file = file_get_contents('путь_к_исходному_файлу');

$pieces = explode("$$$$", $file);

foreach($pieces as $i=>$value)

{

$handle = fopen("имя_выходного_файла" . $i, "w");

fwrite($handle, $value);

fclose($handle);

}

Unlock
На сайте с 01.08.2004
Offline
786
#9

Роман, строки $$$$ в конце новых файлов нужны. PHP 4, чем заменить file_put_contents?

S
На сайте с 13.07.2007
Offline
56
#10

Shtogrin, зачем еще проверка на MOL_ID?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий