Как в файле изменить определённые строки?

Аватара пользователя
NewOLDi

Как в файле изменить определённые строки?

Сообщение NewOLDi »

Есть файл с большим количеством строк. Нужно найти определённые строки (вхождения фраз) и, при их обнаружении, добавить к началу каждой из них, скажем, символ комментария - ;.



Я знаю как это сделать путём полной перезаписи существующего файла (т.е. загнать инфу из файла в память и все замены провести там, после чего перезаписать существующий файл), но это, имхо, не совсем правильно и память жрёт Изображение
Аватара пользователя
NewOLDi

Re: Как в файле изменить определённые строки?

Сообщение NewOLDi »

madmasles

Самый быстрый и лёгкий - загнать всю инфу в память и там с ней работать. Но этот вариант не всегда подходит, если речь идёт о слишком больших объёмах данных.



Медленный и муторный, но эффективный с точки зрения объёма занимаемой памяти - работа с файлом напрямую.



В дополнение, хочется отметить, что первое и второе может быть объеденено для полного конценцуса, т.е. - золотая середина. В память загоняется не вся инфа, а её части по мере необходимости.



Так что, исходить нужно из задач, стоящих перед Вами. Отсюда и будет выбираться оптимальный путь...



Ну как-то так Изображение



ЗЫ: А извращаться над каждым из вариантов можно сколь угодно много, хотя от перестановки мест слагаемых... ну разве что сокращать код и заниматься оптимизацией.
Аватара пользователя
madmasles

Re: Как в файле изменить определённые строки?

Сообщение madmasles »

NewOLDi,



_FileWriteToLine() посмотрите в библиотечных функциях, которые
Цитата:



я ооочень люблю...
Аватара пользователя
kaster

Re: Как в файле изменить определённые строки?

Сообщение kaster »

Код:

Код: Выделить всё

$sFile = @ScriptDir & '\test.txt'; путь до текстового файла, который подлежит обработке - должен существовать
$tmpFile = @ScriptDir & '\test_new.txt'; путь до нового файла, который получится после обработки - если не существует создаться автоматически
$hRead = FileOpen($sFile, 0); открываем первый файл для чтения
$hWrite = FileOpen($tmpFile, 2); открываем/создаем второй файл для записи/перезаписи
$template = 'string must exist in file'; фраза которая должна существовать в строке для начала обработки
$sAdd = ';'; символы которые добавятся перед найденной строкой
While 1
	$sLine = FileReadLine($hRead); считывание строк первого файла одна за другой
	If @error Then ExitLoop; если конец файла выходим из скрипта
	If StringInStr($line, $template) Then; условие нахождения нужной строки
		FileWriteLine($hWrite, $sAdd & $sLine); добавление символов для найденной строки
	Else; условие когда строка не искомая
		FileWriteLine($hWrite, $sLine); просто перезаписываем эту строку как есть
	EndIf; конец условия
WEnd; конец цикла
FileClose($hRead)
FileClose($hWrite); закрываем файлы для соблюдения правил приличия и хороших манер
Аватара пользователя
madmasles

Re: Как в файле изменить определённые строки?

Сообщение madmasles »

kaster и NewOLDi,



У меня через массив вот так работает:



Код:

Код: Выделить всё

#include 
$aRecords = ""
_FileReadToArray("my.txt", $aRecords)
For $i = 1 To $aRecords[0]
    If StringInStr($aRecords[$i], "То что ищем") > 0 Then
        _FileWriteToLine("my.txt", $i, StringReplace($aRecords[$i], $aRecords[$i], ";" & _
                $aRecords[$i]), 1)
    EndIf
Next
Аватара пользователя
NewOLDi

Re: Как в файле изменить определённые строки?

Сообщение NewOLDi »

Цитата NewOLDi:



это, имхо, не совсем правильно
Как в файле изменить определённые строки?




Как раз это самый правильный вариант, а память заполняется временно, если переменная массива локальная, то после выхода из функций память высвобождается, а если глобальная, то после использования массива его можно "онулировать":





Код:

Код: Выделить всё

$aArray = 0
Аватара пользователя
Creat0R

Re: Как в файле изменить определённые строки?

Сообщение Creat0R »

Нууу.... нет так нет, бум использовать память и полностью перезаписывать имеющийся файл Изображение
Аватара пользователя
NewOLDi

Re: Как в файле изменить определённые строки?

Сообщение NewOLDi »

Цитата NewOLDi:



Представьте, что файл размером в 1 Гб
Как в файле изменить определённые строки?




Но без построчного чтения с начала всё ровно не обойтись:





Код:

Код: Выделить всё

$sFile = @DesktopDir & "\File.txt"
$sInStr = "Some Data"
$hFile = FileOpen($sFile, 0)
While 1
    $sLine = FileReadLine($hFile)
    If @error  0 Then ExitLoop
    If StringRegExp($sLine, "(?i)^[^;].*" & $sInStr & ".*$") Then
        $iPos = FileGetPos($hFile) - StringLen($sLine) - StringLen(@CRLF)
        FileClose($hFile)
        $hFile = FileOpen($sFile, 1)
        FileSetPos($hFile, $iPos, 0) ;$FILE_BEGIN
        FileWrite($hFile, ";" & $sLine)
        ExitLoop
    EndIf
WEnd
FileClose($hFile)
Аватара пользователя
Creat0R

Re: Как в файле изменить определённые строки?

Сообщение Creat0R »

Creat0R, нууу - строка не файл, как никак Изображение Благодарю, вроде как работает.
Аватара пользователя
NewOLDi

Re: Как в файле изменить определённые строки?

Сообщение NewOLDi »

Creat0R, нууу - строка не файл, как никак Изображение Благодарю, вроде как работает.
Ответить

Вернуться в «AutoIt»