[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: замена по тексту php
vestmar
Доброго времени суток, уважаемые знатоки.
стоит задача, в текстовом файле 250 000 строк размер 120 мб
в тексте встречаются химические вещества, они написаны в другом текстовом файле и в нём 10470 строк,
надо заменить на случайные другие всего 20,
весь процесс я примитивно вредставляю

foreach(большой файл as строку_текста) {

foreach(список хим веществ as строку_хим_вещества) {

preg_peplace (строка_хим_вещества, строка_текста, переменная)

}

запись массива[] строка_текста

}

вроде всё просто, но это же дико, 250 000 строк проверить 10470 раз ещё и через preg_replace (потому что обязательная регулярка для хим_вещества [^\w]веществл )

Подскажите как такое оформить?
AllesKlar
vestmar
Цитата
файле и в нём 10470 строк
не так уж и много, можно запихать в массив. Каждый элемент массива - одно химическое вещество.
далее, когда перебираешь строки своего 120мб файла, выдергиваешь рандомно элемент массива, и пишешь в строку.

up:
Хотя, кажется, я не понял задачу.
ну, в общем смысл в том, чтобы сгенерировать масив (можно даже ассоциативный) и работать с ним без перебора

_____________
[продано копирайтерам]
walerus
Не совсем ясна задача.
Цитата
в текстовом файле 250 000 строк размер 120 мб
в тексте встречаются химические вещества, они написаны в другом текстовом файле и в нём 10470 строк,
надо заменить на случайные другие всего 20,
Разбираем:

file_1.txt содержит 250 000 строк текста, в котором встречаются химические вещества, размер файла 120Мб
file_2.txt содержит 10 470 строк названий химических веществ, размер файла ??

надо заменить на случайные другие всего 20 - что заменить? где заменить?

В файле_1 нужно рандомно из всего текста, заменить всего 20ть химических слов, взяв слова из 2го файла... или что?...

Пример файла_1 и файла_2, что бы было понятно че куда...
p.s. ну и свои наброски кода
vestmar
Извините за такое непонятное письмо!

В большом файле текстовом файле встречаются хим вещества,
у меня есть полный список их, в отдельном файле 10470 химикатов (1),
и есть список на которые нужно заменить 20 всего (2),

Так вот из большого файла надо заменить всем хим вещества по списку (1) которые совпадут в тексте, на рандомные 20 (2),

Я составлю пример завтра, Спасибо.
walerus
Снова не совсем понятно...
Есть большой файл с текстом, текст содержит хим.вещества, которые нужно будет заменить, с этим все понятно.

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

или там будет расшифровка?, типа Cu - Медь...
vestmar
список веществ которых нужно найти 10470 и заменить на случайные 20
представьте себе

найти (хим вещество1|хим вещество2|хим вещество3|хим вещество4|и так до 10470)
walerus
Все, я в ауте... Жду примеры файлов (достаточно по 50 строк), а так же примеры:

имеем на входе файл 1 ( файл прикреплен ), в котором нужно будет произвести замены, файл БОЛЬШОЙ !!! и загонять его в массив - это не комильфо.

имеем на входе файл 2 ( файл прикреплен ), который содержит ( ... )
...

имеем на входе файл N ( файл прикреплен ), который содержит ( ... )

нужно на выходе получить это - и тоже пример...

потому как, до сих не понятно что нужно unsure.gif

либо в аську стукай, аська в профиле.
vestmar
walerus Спасибо Вам!) что уделили столько времени! Если не разберусь сам напишу в ICQ Вам)
AllesKlar
walerus
Да все понятно. Есть файл и два списка. если в файле встречается элемент списка #1 , то заменить его рандомным элементом списка #2

Как я уже выше и сказал.
Файлы с хим элементами читаем в массивы и работаем с ними.

$handle = @fopen("inputfile.txt", "r");
while ($buffer = fgets($handle, 4096))
{
$tmp_arr = explode(' ', $buffer); // Дописать коректную разбивку на слова. Все знаки препинания - отдельные слова, чтобы потом можно было собрать назад строку.
foreach($tmp_arr as &$word)
{
if(in_array($word, $array_10470))
{
$word = $array_20[rand(0, count($array_20) - 1)];
}
}


$str = implode(' ', $tmp_arr);
//далее пишем строку в выходной файл
}
fclose($handle);


Это как база. Дальше пороботать над оптимизацией.
Но, то что 120 метров текста не надо обрабатывать регуляркой - это однозначно.

_____________
[продано копирайтерам]
AllesKlar
В качестве оптимизации, сделать список слов, не подлежащих проверки(знаки препинания, более одного пробела и т.д.)

_____________
[продано копирайтерам]
vestmar
СПАСИБО! AllesKlar так гораздо быстрее! смысл понял дальше я сам)
vestmar
Единственное что хотел бы узнать
вот к примеру строка- Вася пошёл в магазин, купить пива

как получить

Array
(
[0] => Вася
[1] => пошёл
[2] => в
[3] => магазин
[4] => ,
[5] => купить
[6] => пива
)

что бы в массив попала и запятая?
Bolik
explode (" ", str_replace (",", " ,",строка));
vestmar
а потом я соберу обратно в строку? )
в такую какой была
AllesKlar
vestmar
Поэтому я и написал:
Цитата
// Дописать коректную разбивку на слова. Все знаки препинания - отдельные слова, чтобы потом можно было собрать назад строку.

Ну, это уже типичная задачка из методички. Думай, пробуй..

Главное, что ты понимаешь:
Цитата
а потом я соберу обратно в строку? )
в такую какой была


_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.