purebasic.info

PureBasic forum
Текущее время: Пн дек 11, 2017 4:36 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Как заменить слово в файле?
СообщениеДобавлено: Вс окт 29, 2017 3:54 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте!
Задача, как всегда проста до стыда, а додуматься не могу....
Есть текстовой файл(формт тхт)
в нём имеется текст, который необходимо обработать, разумеется не загружая при этом весь файл в память.
А точнее нужно найти и заменить в файле заданное слово.
Будь это просто данные в оперативной памяти - всё просто, НО... это файл.
Функций помогающих сделать замену я не нащел.
Считать\записать - сколько угодно от строки до байта, а вот как грамотно заменить?
Заранее спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как заменить слово в файле?
СообщениеДобавлено: Вс окт 29, 2017 4:43 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Сб мар 28, 2015 11:06 pm
Сообщений: 112
Откуда: Україна
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 4
Вариант через временный файл:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
OldFilename$ = "f:\result.txt"
NewFilename$ = OldFilename$ + ".tmp"
 
If CreateFile(0, NewFilename$)
  If ReadFile(1, OldFilename$)
    Repeat
      string.s = ReadString(1)
      newstring.s = ReplaceString(string, "old text", "new text")
      WriteStringN(0, newstring)
    Until Eof(1)
    CloseFile(1)
  EndIf
  CloseFile(0)
 
  DeleteFile (OldFilename$)
  RenameFile (NewFilename$, OldFilename$)
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как заменить слово в файле?
СообщениеДобавлено: Вс окт 29, 2017 5:36 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2232
Откуда: Russia — Belarus
Благодарил (а): 0 раз.
Поблагодарили: 66 раз.
Пункты репутации: 11
Цитата:
А точнее нужно найти

Поиск в файле уже подразумевает чтение из файла в память.
Другое дело, если ты предполагаешь (или точно знаешь), где в файле находится заменяемое слово...

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как заменить слово в файле?
СообщениеДобавлено: Вс окт 29, 2017 9:40 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Сб авг 05, 2017 8:34 pm
Сообщений: 41
Откуда: Россия, Брянск
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
Цитата:
А точнее нужно найти

Поиск в файле уже подразумевает чтение из файла в память.
Другое дело, если ты предполагаешь (или точно знаешь), где в файле находится заменяемое слово...

Всё верно. В память фаёл загружать всё равно надо, но одно дело загрузить строку(символов 100) и совсем другое весь текст.
Вот к примеру потребовалось получить статистику по "войне и миру"
Как это сделать?
Если "Война и мир" находится целиком в массиве, то все относительно просто...
Берем первое слово, ищем все совпадения. Если совпадение найдено помечем слово как посчитанное(каким-нибудь спец. символом), дабы не считать его дважды и собственно счиаем. Далее второе слово и если оно не помечено, повторяем операцию, а если помечено пропускаем. И так до конца текста.
На выходе получаем примерно такую катринку:
Стол - повторилось 6656 раз
Стул -1289 раз
---
---
---
Олух - 1 раз
:)
А вот как пометить посчитанные слова в файле???
Вот в чем фокус.

Есть, конечно, такой вариант:
Создаем временный файл.
Записываем туда первое слово из "войны и мира"
Смотрим второе, третье, четвертое .... N-e слово из "войны и мира" и сравниваем его с записанным(и) во временный файл.
Если такого слова нет - дописываем. и т.д...
Так создаем список уникальных слов.
А потом считаем сколько каждое из уникальных слов повторяется в "войне и мире".
Но может можно как-то упростить этот процес?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как заменить слово в файле?
СообщениеДобавлено: Вс окт 29, 2017 10:58 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6200
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
В заголовке одна проблема, в обсуждении уже другая.
Надо заменить во всём тексте слово или посчитать сколько раз встречаются разные слова в тексте?
Цитата:
"Если "Война и мир" находится целиком в массиве, то все относительно просто..."

Ну так поместите все слова в массив, это не трудно. Потом массив можно отсортировать, и за 1 проход подсчитать все слова, которые там встречаются и сколько раз.
Если надо заменить слово то LinXP выдал самый простой вариант, работает долго при большом кол-ве строк, но надёжно.
Если комп позволяет, то можно и сразу весь текст считать в память, как строку, а потом уже замену произвести:
Для наглядного примера, заменил в романе С. Кинга "Стрелок" слово "стрелок" на слово "козёл". Ушло на это меньше секунды :D
Код:
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
60
61
62
63
64
65
66
67
68
69
70
 
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Editor_0
  #Button_1
EndEnumeration
;}
 
; Эта процедура загружает текст из файла в редактор
Procedure LoadFile(Gadget,FileName.s)
Text.s="" ; Очищаем строковую переменную
 If ReadFile(1,FileName) ; Открываем файл
  Size=Lof(1) ; Узнаём размер файла
  If Size>0
    Text=Space(Size) ; Заполняем переменную числом пробелов, равным размеру файла
    ReadData(1,@Text,Size) ; Читаем данные из файла в строковую переменную "Text"
  EndIf
  newTxt.s = ReplaceString(Text, "стрелок", "козёл") ; меняем строки
  SetGadgetText(Gadget,newTxt) ; Помещаем данные из переменной "newTxt" в редактор
  CloseFile(1) ; Закрываем файл
 Else
  MessageRequester("Ошибка","Не удалось открыть файл!")
 EndIf
EndProcedure
 
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 603, 106, 589, 400, "Редактор", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
     EditorGadget(#Editor_0, 15, 15, 555, 305)
     ButtonGadget(#Button_1, 25, 330, 95, 40, "Открыть файл")
 
  EndIf
EndProcedure
 
OpenWindow_Window_0()
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Editor_0
      ElseIf EventGadget = #Button_1
  StandardFile$ = ""  
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
  If File$
    LoadFile(#Editor_0, File$)
  EndIf
 
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}


Нет у меня Войны и мира, но думаю тоже быстро справится.
Естественно, в редактор тебе не надо, сразу строку записать в файл.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как заменить слово в файле?
СообщениеДобавлено: Пн окт 30, 2017 3:16 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 527
Благодарил (а): 51 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
Если слова посчитать, то можно карту использовать, принцип такой.
Создаём карту, берём первое слово, оно будет ключем, берём содержимое ключа и прибавляем 1
и сортировать не нужно, это лишнее время, всё остальное карта за вас сделает

подсчёт цветов у картинки, в качестве ключа цвет отдельной точки, в этом случае размер карты и будет количеством цветов
Код:
1
2
3
4
5
For k=0 To w
For j=0 To h
unique("k"+Point(k, j))
Next
Next



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Как заменить слово в файле?
СообщениеДобавлено: Пн окт 30, 2017 9:18 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 545
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Селекин Сергей писал(а):
qpAHToMAS писал(а):
Цитата:
А точнее нужно найти

Поиск в файле уже подразумевает чтение из файла в память.
Другое дело, если ты предполагаешь (или точно знаешь), где в файле находится заменяемое слово...

Всё верно. В память фаёл загружать всё равно надо, но одно дело загрузить строку(символов 100) и совсем другое весь текст.
Вот к примеру потребовалось получить статистику по "войне и миру"
Как это сделать?
Если "Война и мир" находится целиком в массиве, то все относительно просто...
Берем первое слово, ищем все совпадения. Если совпадение найдено помечем слово как посчитанное(каким-нибудь спец. символом), дабы не считать его дважды и собственно счиаем. Далее второе слово и если оно не помечено, повторяем операцию, а если помечено пропускаем. И так до конца текста.
На выходе получаем примерно такую катринку:
Стол - повторилось 6656 раз
Стул -1289 раз
---
---
---
Олух - 1 раз
:)
А вот как пометить посчитанные слова в файле???
Вот в чем фокус.

Есть, конечно, такой вариант:
Создаем временный файл.
Записываем туда первое слово из "войны и мира"
Смотрим второе, третье, четвертое .... N-e слово из "войны и мира" и сравниваем его с записанным(и) во временный файл.
Если такого слова нет - дописываем. и т.д...
Так создаем список уникальных слов.
А потом считаем сколько каждое из уникальных слов повторяется в "войне и мире".
Но может можно как-то упростить этот процес?


Тут для начала нужно понять какого объёма файл для загрузки,если он большой то тогда грузить его частями.
А функции поиска текста выкладывал в разделе фасма(её подшаманить что бы после первого вхождения не было выхода а прибавлялось в переменную количества и на выходе получаем кол. входящего текста). :roll:


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB