Тема: AHK:Удаление конкретной строчки из файла
Вообщем, есть файл chatlog.txt, надо сделать так чтобы можно было удалить из этого файла конкретную строчку.
Помогите пожалуйста.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Вообщем, есть файл chatlog.txt, надо сделать так чтобы можно было удалить из этого файла конкретную строчку.
Помогите пожалуйста.
inputfile := "C:\1.txt"
outputfile := "C:\2.txt"
n := 3 ; номер строки
Loop, Read, % inputfile
if A_Index != %n%
new .= A_LoopReadLine "`r`n"
FileDelete, % outputfile
FileAppend, % new, % outputfileinputfile := "C:\1.txt" outputfile := "C:\2.txt" n := 3 ; номер строки Loop, Read, % inputfile if A_Index != %n% new .= A_LoopReadLine "`r`n" FileDelete, % outputfile FileAppend, % new, % outputfile
Он работает не так как нужно.Если можно еще пример приведите.
Что значит не так как нужно?
Я так понял что этот скрипт просто создает еще один файл только уже без той строчки, котроую скрипт удалил из другого файла.А мне нужно чтобы новый файл не создавался, а проссто в одном файле убралась конкретная строчка.
Я думаю, что если вы пробежитесь по командам, которые я использовал, то сможете исправить его сами.
Дык АНК не умеет вроде ж строки удалять, только файл.
Дык АНК не умеет вроде ж строки удалять, только файл.
А можно тогда так сделать: просто очистить содержимое файла?
А можно тогда так сделать: просто очистить содержимое файла?
FileName = %A_Desktop%\new 2.txt
File := FileOpen(FileName, "w")
File.Length := 0, File.Close()
Если удалить всё содержимое, то можно так:
FileOpen("d:\temp\chatlog.txt", "w").Close()Ну а строчку непосредственно из файла вы никак не вырежете. Нужно прочитать файл, убрать строчку и то, что осталось, записать обратно в файл.
А можно тогда так сделать: просто очистить содержимое файла?
FileName = %A_Desktop%\new 2.txt File := FileOpen(FileName, "w") File.Length := 0, File.Close()
Спасибо, теперь работает.
YMP предложил более простую запись:
FileOpen("d:\temp\chatlog.txt", "w").Close()Вот только не ясно, чем для вас, это отлично от:
FileDelete, d:\temp\chatlog.txtЭтот код FileOpen("d:\temp\chatlog.txt", "w").Close() создает копию файла с таким же именем файла, но только пустой.
Где создаёт?
Где создаёт?
Рядом с этим файлом chatlog.txt он создает точно такой же файл chatlog.txt, только пустой
То есть в вашем виндовс, у вас в одной папке могут жить 2 файла с одинаковым именем?
То есть в вашем виндовс, у вас в одной папке могут жить 2 файла с одинаковым именем?
Вроде бы нет, но скрипт утверждает обратное.
Если ТС не шутит, значит имена файлов различные с точки зрения файловой системы ))
if "chatlog.txt" = "сhatlog.txt"
MsgBox Совпадают
else
MsgBox Не совпадают
в первом "c" английская, во втором "c" - русская
Если ТС не шутит, значит имена файлов различные с точки зрения файловой системы ))
if "chatlog.txt" = "сhatlog.txt" MsgBox Совпадают else MsgBox Не совпадают+ открыть спойлерв первом "c" английская, во втором "c" - русская
Не совпадают
Ну, у меня-то все буквы английские в примере. Стало быть у реального файла русская буква есть.
Ну а строчку непосредственно из файла вы никак не вырежете. Нужно прочитать файл, убрать строчку и то, что осталось, записать обратно в файл.
Но если знать в байтах смещение нужной строки и её длинну, то можно "затереть" пробелами. Например в таком файле:
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890в кодировке CP1251 (ANSI), этот код заменит третью строку пробелами:
FileName = C:\Users\sergey\Desktop\new.txt
TestString := " " ; 10 пробелов, т.к. знаем что длинна строки 10 символов
File := FileOpen(FileName, "rw")
File.Pos := 22 ; смещение в байтах + 2 перевода строки
File.Write(TestString)
File.Pos := 0 ; возвращаем смещение на начало файла
MsgBox % File.Read()
File.Close()Увы из-за незнания сути кодировок и байтов, универсальный код сделать не могу.
Хотя если подумать то возможно от смещения перезаписать остаток файла, и таким образом удалить таки строку.
FileName = C:\Users\sergey\Desktop\new.txt
WriteString := ""
Seek := 12 ; смещение до третьей строки (байт)
Len := 6 ; длинна третьей строки (байт)
File := FileOpen(FileName, "rw")
File.Pos := Seek ; смещение
End := File.Read() ; чтение остатка
End := SubStr(End, Len + 1)
; здесь надо как-то обрезать начало по количеству байт нужной строки
; так сработает только в CP1251
; как и значения Seek и Len
File.Length := Seek ; обрезаем файл
File.Write(WriteString . End) ; втавляем от смещения то что надо и остаток
File.Pos := 0
MsgBox % File.Read()
File.Close()
Файл:
1 str
2 str
3 str
4 str
5 str
6 str
7 str
8 str
9 str
0 str
Также если прописать
WriteString := "новая строка`n"то можно заменять строки.
Хотя если подумать то возможно от смещения перезаписать остаток файла, и таким образом удалить таки строку.
Ну, если файл сильно большой, это может иметь смысл. Но смещение, действительно, зависит от кодировки. В однобайтных ANSI и в UTF-16 не сложно посчитать, хотя у последнего надо ещё учитывать, если ли в начале файла BOM или нет. А в UTF-8 уже так просто не получится, т.к. в разных символах разное количество байтов. И дальневосточные ANSI, кажись, многобайтные, там тоже сложнее.
YMP
Может скажу глупость... А если прочитать файл в двоичном\бинарном виде file.RawRead, искомую строку представить тоже как бинарную в формате считываемого файла File.Encoding. RegExMatch найдёт что нужно как 0101... Даст позицию. Разделить её на восемь, вот и нужное смещение.
А при чём тут RegExMatch? Она же в тексте ищет. Если имеете в виду преобразовать каждый бит в символ 1 или 0, так это размер считанного будет в 16 раз больше файла, если в юникодном АНК.
А при чём тут RegExMatch? Она же в тексте ищет.
Ну, я подумал что в итоге получится текст ввиде единиц и нулей.
А не могли бы вы объяснить работу с ини файлами? Каким образом в них происходит запись?
Ну, я подумал что в итоге получится текст ввиде единиц и нулей.
Нет, текст получается, если читать как текстовый или специально преобразовывать в хекс-, двоичное или ещё какое отображение бинарных данных.
А не могли бы вы объяснить работу с ини файлами? Каким образом в них происходит запись?
Там используется API WritePrivateProfileString, насколько мне известно. А как она действует, я не знаю.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться