Что нового

[Данные, строки] Запись в определённую строку

Вовчик55

Новичок
Сообщения
57
Репутация
0
Здравствуйте. Возможно ли с помощью AutoIt записать в файле в определённую строку свои данные?
Например:
Код:
1
2
3
4
5
И надо вставить между "3" и "4" строкой свою строку, допустим с таким содержанием "0123"
Как найти в файле строку с "3" я знаю, но как заставить AutoIt записать именно после строки "3" такую запись "@CRLF 0123"
PS строк в файле может быть до 5000
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Вовчик55
Смотри в справке
Код:
_FileWriteToLine


Кстати я вчера хотел предложить новый вариант этой функции чуть быстрее работающий за счёт того что не перезаписывает весь файл, а ставит указатель в позицию и перезаписывает только то что после вставляемой строки. Но столкнулся с проблеймой, если Юникод то указатель не работает, потому что он видимо воспринимает символы однобайтовые.
Вот мой вариант для ASCII
Код:
_FileWriteToLine(@ScriptDir & '\1.txt', 5, 'Привет', 1)

Func _FileWriteToLine($sFile, $iLine, $sText, $fOverWrite = 0)
	If $iLine <= 0 Then Return SetError(4, 0, 0) ; Проверка чтобы строка была  0 и больше
	If Not IsString($sText) Then ; Проверка чтобы переменная $sText была строкой и не пустой
		$sText = String($sText)
		If $sText = "" Then Return SetError(6, 0, 0)
	EndIf
	If $fOverWrite <> 0 And $fOverWrite <> 1 Then Return SetError(5, 0, 0) ; Проверка валидности флага $fOverWrite
	If Not FileExists($sFile) Then Return SetError(2, 0, 0) ; Проверка существования файла (странно что последний)

	Local $sRead_File = FileRead($sFile) ; Читаем файл
	Local $iEncoding = FileGetEncoding($sFile)
	Local $hFile = FileOpen($sFile, $iEncoding + $FO_APPEND) ; Открываем файл, чтобы вставить строку
	If $hFile = -1 Then Return SetError(3, 0, 0) ; Вылет если не открылся
	If $iLine = 1 Then
		Local $iPos = 0
	Else
		Local $iPos = StringInStr($sRead_File, @LF, 1, $iLine - 1)
		If Not $iPos Then Return SetError(1, 0, 0) ; Если номер строки больше чем число строк
	EndIf
	FileSetPos($hFile, $iPos, $FILE_BEGIN) ; Установка позиции в позицию вставки
	Local $CRLF = @CRLF
	If $fOverWrite Then
		$iPos = StringInStr($sRead_File, @LF, 1, 1, $iPos + 1)
		If Not $iPos Then
			$sRead_File = ''
			$CRLF = ''
		EndIf
	EndIf
	$sRead_File = StringTrimLeft($sRead_File, $iPos) ; Обрезка левой части данных
	FileWrite($hFile, $sText & $CRLF & $sRead_File)
	$iPos = FileGetPos($hFile)
	FileClose($hFile)

	If $fOverWrite Then
		$iSize = FileGetSize($sFile)
		If $iPos < $iSize Then
			$hFile = _WinAPI_CreateFile($sFile, 2, 4)
			_WinAPI_SetFilePointer($hFile, $iPos)
			_WinAPI_SetEndOfFile($hFile)
			_WinAPI_CloseHandle($hFile)
		EndIf
	EndIf

	Return 1
EndFunc   ;==>_FileWriteToLine
 
Верх