Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как в файле изменить определённые строки?

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

Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 13:01, 28-01-2010

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


NewOLDi,

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

Отправлено: 13:11, 28-01-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$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); закрываем файлы для соблюдения правил приличия и хороших манер

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 13:22, 28-01-2010 | #3


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


kaster и NewOLDi,

У меня через массив вот так работает:
Код: Выделить весь код
#include <file.au3>

$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

Отправлено: 13:42, 28-01-2010 | #4


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


kaster, у Вас используются два файла, а нужно всё проворачивать в одном, т.е. и читать и записывать (при необходимости) одновременно.

madmasles, массив-память - одно и тоже (в условиях я указал на это), а нужно напрямую, без загона инфы в память. Представьте, что файл размером в 1 Гб И это, любить библиотечные функции - не означает все их знать и уметь пользоваться, любовь здесь с точки зрения разумности использования того, что уже давно придумано и просчитано (типа - зачем изобретать велосипед).

Отправлено: 13:55, 28-01-2010 | #5


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

Код: Выделить весь код
$aArray = 0

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 14:03, 28-01-2010 | #6


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:30, 28-01-2010 | #7


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата 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)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:43, 28-01-2010 | #8


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:49, 28-01-2010 | #9


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Интересно, сколько таких способов и какой из них наиболее оптимальный и почему.

Отправлено: 16:02, 28-01-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как в файле изменить определённые строки?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как изменить разрешение экрана из командной строки во время установки системы? Zibit Автоматическая установка Windows 2000/XP/2003 29 29-01-2018 23:00
[решено] Как удалить строки в текстовом файле при отсутсвии файла в опрелеленном месте? Pozia AutoIt 23 14-05-2009 21:41
Интерфейс - как изменить интерфейс адресной строки? Ingolder Microsoft Windows Vista 2 12-05-2009 22:37
[решено] Работа из командной строки | Убрать все пробелы в текстовом файле Greyman Хочу все знать 11 17-06-2007 22:44
Как изменить из командной строки DNS на клиенте? Myckyc Сетевые технологии 1 26-08-2003 04:20




 
Переход