1

Тема: AHK:Удаление конкретной строчки из файла

Вообщем, есть файл chatlog.txt, надо сделать так чтобы можно было удалить из этого файла конкретную строчку.
Помогите пожалуйста.

Как сказал мой дед - Я твой дед

2

Re: AHK:Удаление конкретной строчки из файла

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, % outputfile

3

Re: AHK:Удаление конкретной строчки из файла

Malcev пишет:
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, % outputfile

Он работает не так как нужно.Если можно еще пример приведите.

Как сказал мой дед - Я твой дед

4

Re: AHK:Удаление конкретной строчки из файла

Что значит не так как нужно?

5

Re: AHK:Удаление конкретной строчки из файла

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

Как сказал мой дед - Я твой дед

6

Re: AHK:Удаление конкретной строчки из файла

Я думаю, что если вы пробежитесь по командам, которые я использовал, то сможете исправить его сами.

7

Re: AHK:Удаление конкретной строчки из файла

Дык АНК не умеет вроде ж строки удалять, только файл.

8

Re: AHK:Удаление конкретной строчки из файла

Zohann пишет:

Дык АНК не умеет вроде ж строки удалять, только файл.

А можно тогда так сделать: просто очистить содержимое файла?

Как сказал мой дед - Я твой дед

9 (изменено: serzh82saratov, 2013-07-10 11:39:45)

Re: AHK:Удаление конкретной строчки из файла

А можно тогда так сделать: просто очистить содержимое файла?


FileName = %A_Desktop%\new  2.txt
File := FileOpen(FileName, "w")
File.Length := 0, File.Close()
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK:Удаление конкретной строчки из файла

Если удалить всё содержимое, то можно так:

FileOpen("d:\temp\chatlog.txt", "w").Close()

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

11

Re: AHK:Удаление конкретной строчки из файла

serzh82saratov пишет:

А можно тогда так сделать: просто очистить содержимое файла?


FileName = %A_Desktop%\new  2.txt
File := FileOpen(FileName, "w")
File.Length := 0, File.Close()

Спасибо, теперь работает.

Как сказал мой дед - Я твой дед

12

Re: AHK:Удаление конкретной строчки из файла

YMP предложил более простую запись:

 FileOpen("d:\temp\chatlog.txt", "w").Close()

Вот только не ясно, чем для вас, это отлично от:

FileDelete, d:\temp\chatlog.txt
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK:Удаление конкретной строчки из файла

Этот код FileOpen("d:\temp\chatlog.txt", "w").Close() создает копию файла с таким же именем файла, но только пустой.

Как сказал мой дед - Я твой дед

14

Re: AHK:Удаление конкретной строчки из файла

Где создаёт?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: sergeiplugatyr, 2013-07-10 14:55:11)

Re: AHK:Удаление конкретной строчки из файла

serzh82saratov пишет:

Где создаёт?

Рядом с этим файлом chatlog.txt он создает точно такой же файл chatlog.txt, только пустой

Как сказал мой дед - Я твой дед

16

Re: AHK:Удаление конкретной строчки из файла

То есть в вашем виндовс, у вас в одной папке могут жить 2 файла с одинаковым именем?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK:Удаление конкретной строчки из файла

serzh82saratov пишет:

То есть в вашем виндовс, у вас в одной папке могут жить 2 файла с одинаковым именем?

Вроде бы нет, но скрипт утверждает обратное.

Как сказал мой дед - Я твой дед

18

Re: AHK:Удаление конкретной строчки из файла

sergeiplugatyr пишет:

Вроде бы нет, но скрипт утверждает обратное.

Это как?

19

Re: AHK:Удаление конкретной строчки из файла

Если ТС не шутит, значит имена файлов различные с точки зрения файловой системы ))

if "chatlog.txt" = "сhatlog.txt"
   MsgBox Совпадают
else
   MsgBox Не совпадают
+ открыть спойлер

в первом "c" английская, во втором "c" - русская

20

Re: AHK:Удаление конкретной строчки из файла

Irbis пишет:

Если ТС не шутит, значит имена файлов различные с точки зрения файловой системы ))

if "chatlog.txt" = "сhatlog.txt"
   MsgBox Совпадают
else
   MsgBox Не совпадают
+ открыть спойлер

в первом "c" английская, во втором "c" - русская

Не совпадают

Как сказал мой дед - Я твой дед

21

Re: AHK:Удаление конкретной строчки из файла

Ну, у меня-то все буквы английские в примере. Стало быть у реального файла русская буква есть.

22

Re: AHK:Удаление конкретной строчки из файла

YMP пишет:

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

Но если знать в байтах смещение нужной строки и её длинну, то можно "затереть" пробелами. Например в таком файле:

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()

Увы из-за незнания сути кодировок и байтов, универсальный код сделать не могу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23 (изменено: serzh82saratov, 2013-07-19 17:12:38)

Re: AHK:Удаление конкретной строчки из файла

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


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"

то можно заменять строки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK:Удаление конкретной строчки из файла

serzh82saratov пишет:

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

Ну, если файл сильно большой, это может иметь смысл. Но смещение, действительно, зависит от кодировки. В однобайтных ANSI и в UTF-16 не сложно посчитать, хотя у последнего надо ещё учитывать, если ли в начале файла BOM или нет. А в UTF-8 уже так просто не получится, т.к. в разных символах разное количество байтов. И дальневосточные ANSI, кажись, многобайтные, там тоже сложнее.

25 (изменено: serzh82saratov, 2013-07-20 19:20:58)

Re: AHK:Удаление конкретной строчки из файла

YMP
Может скажу глупость... А если прочитать файл в двоичном\бинарном виде file.RawRead, искомую строку представить тоже как бинарную в формате считываемого файла File.Encoding. RegExMatch найдёт что нужно как 0101... Даст позицию. Разделить её на восемь, вот и нужное смещение.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26

Re: AHK:Удаление конкретной строчки из файла

А при чём тут RegExMatch? Она же в тексте ищет. Если имеете в виду преобразовать каждый бит в символ 1 или 0, так это размер считанного будет в 16 раз больше файла, если в юникодном АНК.

27 (изменено: serzh82saratov, 2013-07-20 23:35:08)

Re: AHK:Удаление конкретной строчки из файла

А при чём тут RegExMatch? Она же в тексте ищет.

Ну, я подумал что в итоге получится текст ввиде единиц и нулей.


А не могли бы вы объяснить работу с ини файлами? Каким образом в них происходит запись?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK:Удаление конкретной строчки из файла

serzh82saratov пишет:

Ну, я подумал что в итоге получится текст ввиде единиц и нулей.

Нет, текст получается, если читать как текстовый или специально преобразовывать в хекс-, двоичное или ещё какое отображение бинарных данных.

serzh82saratov пишет:

А не могли бы вы объяснить работу с ини файлами? Каким образом в них происходит запись?

Там используется API WritePrivateProfileString, насколько мне известно. А как она действует, я не знаю.