4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
1 | |
поиск и замена текста в очень большом тексте31.08.2010, 18:16. Показов 8574. Ответов 21
Метки нет (Все метки)
я искал куски текста и заменял их на другие пока не получил System.OutOfMemoryException, вызванное String.Replace(). и стало понятно, что нужно искать другие концепции. вот идея работы с файлом кажется реальной и ее даже можно самому реализовать...но перед этим решил спросить, не знает ли кто как такие проблемы решаются?
0
|
31.08.2010, 18:16 | |
Ответы с готовыми решениями:
21
Поиск и замена текста в большом количестве файлов Поиск слова в большом тексте Поиск подстроки в очень большом файле, чтение маленькими кусками, потоковая обработка Замена в тексте куска текста |
Автор FAQ
1802 / 614 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
|
|
31.08.2010, 18:36 | 2 |
Надо подгружать текст из файла частями, каждый раз запоминая на какой позиции остановился.
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
31.08.2010, 19:06 [ТС] | 3 |
а по какому-то принципу выбирать длину подгружаемой части, чтобы не попасть в середину искомой подстроки? и как быть, если мой алгоритм подразумевал рекурсию?
0
|
Автор FAQ
1802 / 614 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
|
|
31.08.2010, 19:24 | 4 |
А какого рода текст? можно кусочек текста в пример? и пример того, что на что заменяете.
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
31.08.2010, 19:51 [ТС] | 5 |
у меня есть функция f(x,y) и g(x,y), и есть некоторое выражение, например f&g. я должен в этом выражении результат операции & двух операндов заменить на нечто следующее: f+g-Sqrt(f^2+g^2), и в конечном итоге получить выражение, в котором содержатся только x и y. при этом, вместо функций f и g могут функции, содержащие саму операцию &. и задачи могут быть достаточно объемными, мое исключение вызывается, когда рабочая строка достигает размеров порядка ста тысяч символов
0
|
5 / 5 / 0
Регистрация: 01.02.2010
Сообщений: 98
|
|
01.09.2010, 15:23 | 6 |
А сколько "весит" исходный текстовый файл и какое он имеет разширение? Вообще подобное может быть решено с использованием словарей. Замена подразумевает поиск, как правило с использованием словарей можно сократить время поиска и замены кусков текста, т.к. поиск в словаре идет не методом перебора, а методом дихотомии.
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
01.09.2010, 17:04 [ТС] | 7 |
размер файла будет увеличиваться в процессе поиска и замены, и мне абсолютно безразлично каким образом в нем будут хранится данные.
словарь - набор ключей и значений. не могли бы мне объяснить, каким образом это может мне помочь?
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
01.09.2010, 19:37 | 8 |
junkier, Определяется размер считываемого текста размером буфера куда он помещается.
буфер это обыкновенный пасив массив))) из потока на чтение пишеться в буфер текст обрабатывается и потоком записи возвращается в файл. после читается следущая партия текста, лучше реализовывать в цикле while -удобнее. Как альтернатива чтобы голову не ломать можно записывать измененый текст в другой файл( следуя вашим словам что после изменения будет меняться размер файла, изза трудности поймать то место на котором остановилось считывание). Добавлено через 4 минуты Rockedit, какая разница какой текст?!)) потоком выкачиваешь , обрабатываешь, а потом записываешь.
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
01.09.2010, 19:39 [ТС] | 9 |
lifestyle, так все-таки...если в моем буфере окажется только половина искомой "фразы"? я ее не найду и, соответственно, не заменю. а с остальным все вполне понятно
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
01.09.2010, 19:53 | 10 |
ну прочитаешь след кусок файла))))цикл while будет работать пока не дойдет до конца файла
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
01.09.2010, 20:08 [ТС] | 11 |
lifestyle, что-то Вы меня не понимаете. простой пример:
текст: "abcdef", фраза: "cd", длина буфера - 3 символа. я не смогу найти фразу "cd" ни в "abc", ни в "def". мне нужно выбирать размер буфера таким образом, чтобы быть уверенным, что я не "разорву" искомую фразу.
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
01.09.2010, 20:27 | 12 |
а что вам мешает играться с оффсетом?!)))
допустим из фразы abcdef прочиталось в buffer abc вы ищите cd значит индекс "каретки" уменьшите на два символа влево и начинайте читать в буффер дальше даже модно на один символ сдвинуть по формуле сдвига n-1 где n=длина искомой строки
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
01.09.2010, 20:50 [ТС] | 13 |
то есть символ 'c' даст мне понять, что надо сдвинуть "каретку"? для меня сейчас этот алгоритм слишком туманен.. можно еще подробнее? в смысле, более обобщенно.
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
01.09.2010, 21:07 | 14 |
нет тебе вернее алгоритму никаких выводов делать ненадо.
есть строгое указание после закачки в буффер картке остановилась на строке abcdef на букве c. Так как ты ищешь строку(последовательность символов) из 2 символов то ты просто каретку остановившующуюся на букве с , сдвигаешь на символ влево. и продолжаешь чтение новой партии текста в буффер. Если бы ты искал строку из 3 символов то двигал бы каретку влево на 2 символа. типа если n-это длина искомой строки , то каретку необходимо сдвигать на n-1 символов в лево, так как на три и более символа ее (в случае со строкой длинной в 3 символа) двигать в лево не имеет смысла потому, что тогда бы эта последовательность нашлась.
1
|
5 / 5 / 0
Регистрация: 01.02.2010
Сообщений: 98
|
||||||
01.09.2010, 23:43 | 15 | |||||
как я понял у вас есть выражение, которое нужно заменить ( в текстовом файле у вас все такие есть пробелы и слово - это набор симоволов + спец.символы разделители). Если вы просто ищете искомую строку в массиве символов и затем ее заменяете, то используйте регулярные выражения.
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
01.09.2010, 23:48 | 16 |
Sergey2009,
хотите удивиться?)тогда читайте внимательнее топик)) ваш вариант опять же вылетит в overflow нельзя открывать файлы и целиком считывать изза вышеприведеной причины оверфлова памяти.сказано строк 100 000 примерно))да и банальный код с буффером намного проще и короче)) ПыСы а что дальше после вылета из цикла при нахождении искомой строки?что с остальным текстом?))) как увидел парсинг в шоковое состояние зашел.Вы реально думаете 100 000 строк по символу парсить?! Не в обиду почитайте о стрингах и стригбилдере и вообще об основах шарпа. совет, а не критика.
0
|
5 / 5 / 0
Регистрация: 01.02.2010
Сообщений: 98
|
|
01.09.2010, 23:56 | 17 |
2 lifestyle
у меня искомый файл для теста, содержит 7 миллионов знаков. Я же пример привел. Естетсвенно нужно учесть и то, что вхождений будет больше одного. Добавлено через 5 минут Я вам тоже советую почитать о использовании стрингов и стрингбилдеров.А еще я советую вам почитать журнал MSDN об использовании словарей и посмотреть примеры кода. И подумайте, как происходит поиск в массиве и словаре. Да, и кстати, этот код считывает и перебирает файл в 10 мб, менее чем за секунду.
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
02.09.2010, 00:21 | 18 |
хм, на досуге попробую обязательно
0
|
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
|
|
02.09.2010, 08:23 [ТС] | 19 |
lifestyle, спасибо большое, мне даже стало интересно это реализовать, но тут дело в том, что мне все равно придется потом этот текстовый файл адекватно разбивать на строки адекватных размеров (дальше надо будет вычислять алгебраическое выражение, и на входе нужна именно строка), и поэтому мне надо придумать, по какому принципу я буду это делать.
а ваш алгоритм на вид действительно так хорош, что осталось сесть и написать код.
0
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
02.09.2010, 08:33 | 20 |
я предположил что вы просите не код(т.к. как тут код просят по другому на этом форуме=) )
можно организовать чтение по строково.чтобы оставливалось чтение при встрече в строке разделителей типа точки запятой и т.п. подобное , которые вы сами определяете
0
|
02.09.2010, 08:33 | |
02.09.2010, 08:33 | |
Помогаю со студенческими работами здесь
20
Поиск замена в тексте Поиск части текста в диапазоне ячеек и замена этого текста на найденное соответсвие Поиск и замена в тексте на ссылку Javascript поиск и замена в тексте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |