Поиск и замена в файле |
Noxter | Дата: Четверг, 18.03.2010, 04:44 | Сообщение # 1 |
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
| Всем привет) Вот мой TXT файл Code "Configs" { "Games" { "Mod" { "GameDir" ".\mod" "hammer" { "TextureForm at" "5" " MapForm at" "4" " Def aultTextureScale" "0.250000" "DefaultLightmapScale" "16" "DefaultSolidEntity" "func_detail" "GameExeDir" " D:\ hal f-l ife 2" "MapDir" ".\sourcesdk_content\mod\mapsrc" "CordonTexture" "tools\toolsskybox" "MaterialExcludeCount" " 0" " Game Exe" "D:\half-life 2\hl2.exe" "BSP" "D:\SourceSDK\Bin\orangebox\bin\vbsp.exe" "Vis" "D:\SourceSDK\Bin\orangebox\bin\vvis.exe" " Lig ht" " D:\ Sou rceSDK\Bin\orangebox\bin\vrad.exe" "BSPDir" ".\mod\maps" "GameData0" "D:\SourceSDK\Bin\orangebox\bin\base.fgd" } } } " SDKVersion" "3" } Мне нужно заменить все символы .\ на D:\SDK. Кто мне подскажет? Да и еще есть код: Code procedure TForm1.Button1Click(Sender: TObject); var f: file; l: Longint; FileName, oldstring, newstring, s: string; begin oldstring := '.\'; newstring := 'D:\SourceSDK\'; FileName := 'C:\GameConfig.txt'; s := oldstring; AssignFile(f, FileName); Reset(f, 1); for l := 0 to FileSize(f) - Length(oldstring) - 1 do begin Application.ProcessMessages; Seek(f, l); BlockRead(f, oldstring[1], Length(oldstring)); if oldstring = s then begin Seek(f, l); BlockWrite(f, newstring[1], Length(newstring)); //ShowMessage('String successfully replaced!'); end; Application.ProcessMessages; end; CloseFile(f); end; Но после нажатия кнопки в файле перезаписывается не только .\ но и следующий символ, и выходит такая фигня D:\SDK\od а не D:\SDK\Mod Заранее спасибо!
Сообщение отредактировал Noxter - Четверг, 18.03.2010, 04:48 |
|
| |
|
Admin | Дата: Четверг, 18.03.2010, 10:58 | Сообщение # 2 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| Ну проблема в том, что BlockWrite пишет поверх уже имеющихся символов. Я бы решил задачу так: сначала считал всю информацию из файла в переменную, затем заменил нужные символы. И перезаписал файл с новой информацией. PS. В строку можно вставить подстроку процедурой insert()
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
ZuBy | Дата: Четверг, 18.03.2010, 14:28 | Сообщение # 3 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| я бы заменял символы через StringReplace.
http://www.zubymplayer.com
|
|
| |
|
Noxter | Дата: Пятница, 19.03.2010, 02:37 | Сообщение # 4 |
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
| ZuBy, Ты мне код подробнее можешь расписать, и объяснить?
|
|
| |
|
ZuBy | Дата: Суббота, 20.03.2010, 12:54 | Сообщение # 5 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| а что тут объяснять? первое: Quote (Admin) Я бы решил задачу так: сначала считал всю информацию из файла в переменную, затем заменил нужные символы. И перезаписал файл с новой информацией второе:Quote (ZuBy) я бы заменял символы через StringReplace. вот и все.
http://www.zubymplayer.com
|
|
| |
|
Noxter | Дата: Суббота, 20.03.2010, 14:21 | Сообщение # 6 |
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
| ZuBy, Да на словах я и сам это знаю а как это кодом написать? Я по-моему в раздел для начинающих написал, а ты мне догадками отвечаешь. Admin, Поможешь?
|
|
| |
|
Xaker | Дата: Суббота, 20.03.2010, 15:00 | Сообщение # 7 |
Ранг 4
Группа: Проверенные
Сообщений: 83
Награды: 1
Репутация: 0
Статус: Offline
| Code for l := 0 to FileSize(f) - Length(oldstring) - 1 do begin StringReplace(s, '.\', ' D:\SDK\Mod',[rfReplaceAll, rfIgnoreCase]); end; может я и не прав, не тестил...
Сообщение отредактировал Xaker - Суббота, 20.03.2010, 15:00 |
|
| |
|
Admin | Дата: Суббота, 20.03.2010, 17:40 | Сообщение # 8 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| Описание функции StringReplace Ну когда мне нужно было выполнить подобную операцию (правда мне нужно было сохранить старую и новую версии файла) я делал примерно так: Code Assign(f1,'1.txt'); Assign(f2,'2.txt'); reset(f1); rewrite(f2);
while not eof(f) do begin Readln(f1,s); // читаем строку // тут изменяем строку нужным образом. Я тупо использовал pos Writeln(f2,s); // пишем в новый файл end;
closeFile(f1); closeFile(f2);
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
Noxter | Дата: Вторник, 25.05.2010, 00:59 | Сообщение # 9 |
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
| Всем привет) Скажите а как заменить строку .\ на %sourcesdk%\ Где %sourcesdk% - это путь к папке D:\SourceSDK\ который берется из реестра HKEY_CURRENT_USER\Environment Смотрите скрин:
Сообщение отредактировал Noxter - Вторник, 25.05.2010, 01:01 |
|
| |
|
skycar | Дата: Вторник, 25.05.2010, 03:34 | Сообщение # 10 |
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
| Заменить строку? Простейшее решение - пробегать её в цикле, сверять с фрагментом и заменять Code var I: Integer; S: string; ... begin for I:=1 to Length(S) do //пробегаем строку if Copy(S, I, 2) = '.\' then //если найден фрагмент... begin Delete(S, I, 2); // он будет удалён... Insert(S, '%sourcesdk%\', I); // ... и заменён end; end; Попробуй
|
|
| |
|