Скрипт для модификации данных

Unlock
На сайте с 01.08.2004
Offline
786
556

Есть такой примерно файл:


-ISIS- -- StrEd --

7 7 0 0 0 0 0 0 0 0999 V2000
0.0041 1.5016 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
0.0041 0.4960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.8664 0.0013 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.8637 0.0013 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.8664 -0.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.8637 -0.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0040 -1.5016 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2 1 2 0 0 0 0
3 2 1 0 0 0 0
4 2 1 0 0 0 0
5 4 1 0 0 0 0
6 3 1 0 0 0 0
7 6 1 0 0 0 0
7 5 1 0 0 0 0
M END
> <Reference>
Journal of Organic Chemistry, 15, p. 2356, 1967

$$$$

-ISIS- -- StrEd --

9 8 0 0 0 0 0 0 0 0999 V2000
3.2762 -0.4173 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0
2.4743 0.1769 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.6341 -0.3713 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-2.4471 0.4173 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-1.6422 -0.2147 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.8373 0.2256 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.0054 -0.3173 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.7671 0.3012 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-3.2762 -0.1067 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 5 1 0 0 0 0
5 8 1 0 0 0 0
6 3 1 0 0 0 0
7 6 1 0 0 0 0
8 7 1 0 0 0 0
9 4 1 0 0 0 0
M END
> <Reference>
Journal of Organic Chemistry, 18, p. 4327, 1982

$$$$

Данные вида Journal of Organic Chemistry, 18, p. 4327, 1982 надо преобразовать к виду Journal of Organic Chemistry, 47, p. 4327, 1982 Т.е. из последней цифры вычесть 1935. Подскажите пожалуйста, как такое сделать?

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

Чуть не сказал mod_rewrite :)

preg_replace чем не устраивает?

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

Всем устраивает :) Только я не знаю PHP и хотя знаю алгоритм как это должно выглядеть, но написать скрипт для замены данных в файле не смогу :( Если бы надо было вывод данных в скрипте поменять, с этим бы справился, вот как брать данные из файла и писать измененные данные в тот же файл не знаю :(

Pro PHP
На сайте с 27.05.2007
Offline
21
#3

Вроде задача и не ложная, но время прийдется потратить.

Ну я бы советовал неспеша начать ее решать примерно так:

1. читаем файл в массив строк:

$arrInputFile = file('filename.txt');

2. массивом проходим по всем строкам, находя нужные нам строки:

foreach( $arrInputFile as $intNum=>$strLine ) {
// пропусаем ненужные нам строки
if ( ($intPos=strpos(...)) )
}

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

Для PHP программистов: Templum - шаблонизатор для php (http://templum.googlecode.com) (замена Smarty), рассылка на Subscribe.ru (http://subscribe.ru/catalog/inet.webbuild.php5pro).
malls
На сайте с 08.08.2005
Offline
255
#4

Пример замены привести можно, но я думаю что задача не одноразовая, сл-но нужно много файлов перелопачивать. Отсюда возникает необходимость где-то брать входной поток, знать куда его писать и т.п. А это уже не на 3 секунды. Просто ради примера лень этим заниматься. Лучше опишите ТЗ подробно, за 10-20 долларов Вам его с удовольствием реализуют.

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

Может конечно фигню полную скажу, но не проще ли искать нужные строки регуляркой типа: Journal of Organic Chemistry, (\d+), (p.) (\d+), (\d{4}) и делать замену вида: Journal of Organic Chemistry, $4-1935/e, $2, $3, $4

Не ручаюсь за точность изложенного, но неужели мыслю в неправильную сторону? :)

Unlock добавил 01.05.2008 в 15:26

malls, опять же, не знаю можно ли такое реализовать, но нужно примерно такое. Прописываю ручками файл в котором надо производить замену, скрипт обрабатывает его и выдает в результате файл, но уже с модифицированными данными. Можно ли средствами PHP открыть файл на записать, производить поиск по регулярке и замену в открытом файле, с помощью опять же регулярного выражения? Заплатить $10-20 не проблема, вопрос кто возмется, если это действительно не 5 строк кода.

tommy-gung
На сайте с 22.11.2006
Offline
304
#6

проверяйте


<?php
$text = file("name_file.txt");
foreach($text as $key=>$value) {
if(trim($value) == "> <Reference>") {
$str = explode(", ", trim($text[$key + 1]));
$str[1] = $str[3] - 1935;
$text[$key + 1] = implode($str, ", ").$text[$key + 2];
}
}

//write
$fo = fopen("name_file.txt", "w");
foreach($text as $val) fwrite($fo, $val);
fclose($fo);
// echo "the end";
?>
Здесь не могла быть ваша реклама
Pro PHP
На сайте с 27.05.2007
Offline
21
#7

Сделано. Проверено, работает на 100%.

Итак, вот код:


<?php

// искомая нами строка
$strFinding = 'Journal of Organic Chemistry, ';
// сколько нужно вычечть?
$intMinus = 1935;

// читаем файл в массив строк
$arrInputFile = file('file.txt');

foreach( $arrInputFile as $intNum=>$strLine ) {
// пропусаем ненужные нам строки
if ( ($intPos = strpos( $strLine, $strFinding ) ) === false )
continue;
// выделяем номера
preg_match( '"([0-9]{2}),[^,]*([0-9]{4}), *([0-9]{4})$"', $strLine, $arrMatches );
// var_dump( $arrMatches );
// подсчитываем разницу
$intResult = $arrMatches[3] - $intMinus;
// перезаписываем исходную строку на новую
$arrInputFile[ $intNum ] = $strFinding . $intResult . ', p. ' . $arrMatches[2] . ', ' . $arrMatches[3] . "\n";
}

// записываем результат в файл
$fd = fopen( 'out.txt', 'w' );
fwrite( $fd, implode( '', $arrInputFile ) );
fclose( $fd );

echo 'Файл преоразован!';

?>

Pro PHP добавил 01.05.2008 в 15:40

Ребята, а какой тег служит для подсветки PHP кода, подскажите пожалуйста. УЖЕ НАШЕЛ В СПРАВКЕ, Спасибо!

Pro PHP добавил 01.05.2008 в 15:48

tommy-gung, я думал что твой код не работает. Но когда проверил, он работает. Если тебе не сложно, расскажи, в чем премудрость твоего кода?

Я много лет занимаюсь программированием на PHP, но впервые, насколько помнится, сталкиваюсь с таким написанием кода. ы написал очень компактный код, который при этом еще и правильно работает. КАК?

Pro PHP добавил 01.05.2008 в 15:50

А, все, догнал. Меня с толку сбили НЕПОНЯТНЫЕ теги. Я из просто в тексте исходного файла не заметил. Тогда все понятно. Что ж, пятерка тебе за быструю реакцию и маленький по размеру код.

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

Всем спасибо, в особенности tommy-gung, все просто и отлично работает!

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