vestmar
13.10.2014 - 23:07
Доброго времени суток, уважаемые знатоки.
стоит задача, в текстовом файле 250 000 строк размер 120 мб
в тексте встречаются химические вещества, они написаны в другом текстовом файле и в нём 10470 строк,
надо заменить на случайные другие всего 20,
весь процесс я примитивно вредставляю
foreach(большой файл as строку_текста) {
foreach(список хим веществ as строку_хим_вещества) {
preg_peplace (строка_хим_вещества, строка_текста, переменная)
}
запись массива[] строка_текста
}
вроде всё просто, но это же дико, 250 000 строк проверить 10470 раз ещё и через preg_replace (потому что обязательная регулярка для хим_вещества [^\w]веществл )
Подскажите как такое оформить?
AllesKlar
13.10.2014 - 23:12
vestmar
Цитата |
файле и в нём 10470 строк |
не так уж и много, можно запихать в массив. Каждый элемент массива - одно химическое вещество.
далее, когда перебираешь строки своего 120мб файла, выдергиваешь рандомно элемент массива, и пишешь в строку.
up:
Хотя, кажется, я не понял задачу.
ну, в общем смысл в том, чтобы сгенерировать масив (можно даже ассоциативный) и работать с ним без перебора
_____________
[продано копирайтерам]
walerus
13.10.2014 - 23:25
Не совсем ясна задача.
Цитата |
в текстовом файле 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
14.10.2014 - 00:58
Извините за такое непонятное письмо!
В большом файле текстовом файле встречаются хим вещества,
у меня есть полный список их, в отдельном файле 10470 химикатов (1),
и есть список на которые нужно заменить 20 всего (2),
Так вот из большого файла надо заменить всем хим вещества по списку (1) которые совпадут в тексте, на рандомные 20 (2),
Я составлю пример завтра, Спасибо.
walerus
14.10.2014 - 15:11
Снова не совсем понятно...
Есть большой файл с текстом, текст содержит хим.вещества, которые нужно будет заменить, с этим все понятно.
Для чего нужен отдельный файл со всеми химикатами?, если нужно заменить всего 20ть из "третьего" списка/файла...
или там будет расшифровка?, типа Cu - Медь...
vestmar
14.10.2014 - 18:06
список веществ которых нужно найти 10470 и заменить на случайные 20
представьте себе
найти (хим вещество1|хим вещество2|хим вещество3|хим вещество4|и так до 10470)
walerus
14.10.2014 - 20:28
Все, я в ауте... Жду примеры файлов (достаточно по 50 строк), а так же примеры:
имеем на входе файл 1 ( файл прикреплен ), в котором нужно будет произвести замены, файл БОЛЬШОЙ !!! и загонять его в массив - это не комильфо.
имеем на входе файл 2 ( файл прикреплен ), который содержит ( ... )
...
имеем на входе файл N ( файл прикреплен ), который содержит ( ... )
нужно на выходе получить это - и тоже пример...
потому как, до сих не понятно что нужно
либо в аську стукай, аська в профиле.
vestmar
14.10.2014 - 20:58
walerus Спасибо Вам!) что уделили столько времени! Если не разберусь сам напишу в ICQ Вам)
AllesKlar
15.10.2014 - 19:28
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
15.10.2014 - 19:33
В качестве оптимизации, сделать список слов, не подлежащих проверки(знаки препинания, более одного пробела и т.д.)
_____________
[продано копирайтерам]
vestmar
16.10.2014 - 16:03
СПАСИБО! AllesKlar так гораздо быстрее! смысл понял дальше я сам)
vestmar
16.10.2014 - 16:10
Единственное что хотел бы узнать
вот к примеру строка- Вася пошёл в магазин, купить пива
как получить
Array
(
[0] => Вася
[1] => пошёл
[2] => в
[3] => магазин
[4] => ,
[5] => купить
[6] => пива
)
что бы в массив попала и запятая?
explode (" ", str_replace (",", " ,",строка));
vestmar
16.10.2014 - 18:15
а потом я соберу обратно в строку? )
в такую какой была
AllesKlar
16.10.2014 - 18:26
vestmar
Поэтому я и написал:
Цитата |
// Дописать коректную разбивку на слова. Все знаки препинания - отдельные слова, чтобы потом можно было собрать назад строку. |
Ну, это уже типичная задачка из методички. Думай, пробуй..
Главное, что ты понимаешь:
Цитата |
а потом я соберу обратно в строку? ) в такую какой была |
_____________
[продано копирайтерам]
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.