Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
1

поиск и замена текста в очень большом тексте

31.08.2010, 18:16. Показов 8574. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
я искал куски текста и заменял их на другие пока не получил System.OutOfMemoryException, вызванное String.Replace(). и стало понятно, что нужно искать другие концепции. вот идея работы с файлом кажется реальной и ее даже можно самому реализовать...но перед этим решил спросить, не знает ли кто как такие проблемы решаются?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2010, 18:16
Ответы с готовыми решениями:

Поиск и замена текста в большом количестве файлов
Всем привет! Появилась необходимость в огромном количестве друзей для браузерки на мейл.ру плюс...

Поиск слова в большом тексте
Здравствуйте, у меня есть большой текст, необходимо в нем найти слово введенное в textBox. Проблема...

Поиск подстроки в очень большом файле, чтение маленькими кусками, потоковая обработка
Доброго времени суток. На данный момент я работаю над лабораторной "Поиск подстроки методом...

Замена в тексте куска текста
Хочу программно сократить прилагательные и причастия что-то типа string txt =...

21
Автор FAQ
Автор 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
Автор 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
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System.Text;
using System.IO;
using System.Collections;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList dictionary = new ArrayList(1000);
            dictionary.Add("21");
            dictionary.Add("34");
            using (StreamReader texFile = new StreamReader(@"D:\belomorkanal-_-_008-belomorkanal-potomu_chto_vor_MPLEER.RU.mp3", Encoding.Default))
            {
 
                 ArrayList ary = Parse(texFile.ReadToEnd());
 
                 while (true)
                 {
                     for (int i = 0; i != dictionary.Count; i++)
                     {
                         if (ary.Contains(dictionary[i]))
                         {
                             ary[ary.IndexOf(dictionary[i])] = "найдено";
                            
                         }
                     }
                     break;
                 }
 
 
            }
 
        }
        static ArrayList Parse(string str)
        {
            StringBuilder sb = new StringBuilder(100);
            ArrayList ary = new ArrayList(1000);
            foreach (char ch in str.ToCharArray())
            {
                if (char.IsLetterOrDigit(ch))
                {
                    sb.Append(ch);
                }
                else if (sb.Length > 0)
                {
                    ary.Add(sb.ToString());
                    sb.Length = 0;
                }
            }
 
            return ary;
 
 
        }
 
    }
}
Добавлено через 2 минуты
как я понял у вас есть выражение, которое нужно заменить ( в текстовом файле у вас все такие есть пробелы и слово - это набор симоволов + спец.символы разделители). Если вы просто ищете искомую строку в массиве символов и затем ее заменяете, то используйте регулярные выражения.
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2010, 08:33
Помогаю со студенческими работами здесь

Поиск замена в тексте
допустим вот такой код <p><a href="football.html">текст........ & # 171 ;Айнтрахта& # 187 ;...

Поиск части текста в диапазоне ячеек и замена этого текста на найденное соответсвие
Имеется список адресов, которым нужно присвоить в отдельной ячейке название микрорайона. Есть...

Поиск и замена в тексте на ссылку
Здравствуйте, Я начинающий в PHP и не до конца знаком с регулярными выражениями. Прошу помочь с...

Javascript поиск и замена в тексте
Добрый вечер! Помогите дорогие скриптеры, я в JS такоооой дуб! Понадобился мне скриптик на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru