Что нового

[Автоматизация] заменить часть текста в одном файле частью из другого

Tosyk

Новичок
Сообщения
206
Репутация
0
Версия AutoIt: 3.4.1

Описание:
дано два файла: 1E5_111.ascii и 1E5_113_skel.ascii
в начале текстового файла 1E5_111.ascii на первой строке стоит 0, мне нужно заменить этот 0 на полное содержимое из другого текстового файла 1E5_113_skel.ascii. Но чтобы не было пустых строк.

я хочу чтобы это было через drag&drop: я тащу 1E5_111.ascii на EXE, этот EXE ищет в папке "1E5_*_skel.ascii" и использует его.

Примечания:
имя может быть любым, сейчас оно "1E5", но оно обязательно одинаковое у первого и второго файла

вот пример файлов: https://drive.google.com/file/d/14SvzfnDWyBDYbDagYX1FCkTzbBfi908B/view?usp=sharing
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
попытался поискать в английском интернете. нашёл такое:
https://stackoverflow.com/questions/8558483/copying-the-contents-of-file-to-another

Код:
;$sourceFile="c:\source.file"
;$destFile="c:\dest.file"

; Open source file, file must exist
$sourceFile=FileOpenDialog("Source file", "c:\", "All(*.*)", 1)
If @error Then
    MsgBox("No file choosen")
    Exit
EndIf

; Open dest file
$destFile=FileOpenDialog("Destination file", "c:\", "All(*.*)")
If @error Then
    MsgBox("No file choosen")
    Exit
EndIf

$result=FileCopy($sourceFile, $destFile)
If ($result = 0) Then
    MsgBox("copy failed")
EndIf


но что-то не работает оно у меня: тут дано два файла, а у меня фактически 1, но второй должен быть найден рядом по имени первого + у мне нужно именно drag&drop. возможно можно как-то адаптировать этот код?

помогите пожалуйста :smile:
 
Сообщения
142
Репутация
-3
Может тебе нужно удалить 0 и дописать в начало файла с сохранением остального содержания?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
ra4o сказал(а):
имя может быть любым, сейчас оно "1E5"
После имени всегда знак подчёркивания "_" ?
да


Добавлено:
Сообщение автоматически объединено:

я накидал тут из скриптов что у меня было, но пока у меня оно не очень хорошо работает:

Код:
#include <File.au3>
#AutoIt3Wrapper_icon=application-x-executable.ico
HotKeySet("{ESC}", "Terminate")

AutoItSetOption("MustDeclareVars", 1)

Global $StrArray[1]

Func DeleteString($sFileName, $sLine)
    Local $FileHwnd

    If Not FileExists($sFileName) Then
        MsgBox(16, "Error", "File not exist")
        Exit
    EndIf

    _FileReadToArray($sFileName, $StrArray)
    _ArrayDelete($StrArray, $sLine)

    $FileHwnd = FileOpen($sFileName, 2)

    For $i = 1 To UBound($StrArray) -1
        FileWriteLine($FileHwnd, $StrArray[$i])
    Next

    FileClose($FileHwnd)
EndFunc

Local $i
Local $sSourceFile, $sDestFile, $sDestPath, $sExePath, $Dir, $sSourceFileSEGM, $sReadFileM, $sReadFileS, $sWriteFile, $iCountLines
Local $sDrive, $sFolder, $sFileName, $sExt, $sParams, $sRunWait, $sFilePy, $sDivider, $sBlendAddon, $sFileDirPath

If $CmdLine[0] <> 0 Then
   ProgressOn("Converting", "", "0%")
   For $i = 1 To $CmdLine[0]
	  $sSourceFile = $CmdLine[$i]
	  _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
	  ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")
	  If FileExists($sSourceFile) Then

		 $sReadFileM = @WorkingDir & $sSourceFile
		 $sReadFileS = @WorkingDir & '\' & $sFileName & '_*_skel' & $sExt

		 $sWriteFile = FileWrite(@WorkingDir & '\' & $sFileName & '_rigged' & $sExt, "")

		 $iCountLines = _FileCountLines($sReadFileS) ; Retrieve the number of lines in the current script.

 		 Run(@ComSpec & ' /c COPY "' & $sReadFileS & '" + "' & $sReadFileM & '" "' & $sWriteFile & '"',"",@SW_HIDE)

;~ 		 DeleteString(@WorkingDir & '\' & '1', 56)

	  Else
		 MsgBox(0, '', "File [" & $sSourceFile & "] not found")
	  EndIf
   Next
   ProgressSet(100, "Converting complete", "100%")

   MsgBox($MB_SYSTEMMODAL, "", "There are " & $iCountLines & " lines in this file.")

   Sleep(1000)
   ProgressOff()
Else
   MsgBox(0, "Usage", "Drop ASCII file(s) on " & @ScriptName)
   ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit (0)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Не знаю - правильно ли я Вас понял, но вот , попробуйте мой вариант . Перетаскивайте файл , например "1E5_111.ascii" на скомпилированый скрипт и он заменит первую строку содержимым второго файла.Так
я хочу чтобы это было через drag&drop: я тащу 1E5_111.ascii на EXE, этот EXE ищет в папке "1E5_*_skel.ascii" и использует его.
( Функцию по удалению пустых строк из файла взял у CreatoR )
Код:
#include <File.au3>

$FullPath = $CmdLine[1]
$Filename = StringRegExp($FullPath, '(^.*)\\(.*)\.(.*)$', 3)
$FileName2 = StringRegExpReplace($FullPath, ".+\\(.+)\_.+", "\1", 1)
$File2 = _FileListToArray($Filename[0] & '\', $FileName2 & '_*_skel.' & $Filename[2], 1)
If Not @error Then
	$TextFile2 = FileRead($File2[1])
	_FileWriteToLine($FullPath, 1, $TextFile2, 1)
	_FileDeleteEmptyLines($FullPath)
Else
	MsgBox(16, 'Ошибка', 'Не найден файл для замены')
EndIf

Func _FileDeleteEmptyLines($sFile)
    Local $sFileContent = StringRegExpReplace(FileRead($sFile), "(\r?\n){1,}", "\1")
    Local $hFOpen = FileOpen($sFile, 2 + FileGetEncoding($sFile))
    FileWrite($hFOpen, StringStripWS($sFileContent, 3))
    FileClose($hFOpen)
EndFunc
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
До кучи мой вариант:
Код:
If Not $CmdLine[0] Then Exit 1
Global $sInputPath, $sInputText, $hSearch, $sSkelFile, $hFile

$sInputPath = StringRegExp($CmdLine[1], '(?i)(.+\\)(([^\\_]+_)[^\\]+\.ascii)$', 1)
If @error Or StringRegExp($sInputPath[1], '(?i)_skel.ascii$') Then Exit 2
$sInputText = FileRead($CmdLine[1])
If @error Then Exit 3
$hSearch = FileFindFirstFile($sInputPath[0] & $sInputPath[2] & '*_skel.ascii')
If $hSearch = -1 Then Exit 4
$sSkelFile = FileFindNextFile($hSearch)
If @error Then Exit 5
FileClose($hSearch)
$sSkelText = FileRead($sInputPath[0] & $sSkelFile)
If @error Then Exit 6
$sSkelText = StringStripWS($sSkelText, 1+2)
$sInputText = StringRegExpReplace($sInputText, '\A\s*(0\s*)', $sSkelText & @CRLF, 1)
If Not @extended Then Exit -1
$hFile = FileOpen($CmdLine[1], 2)
If $hFile = -1 Then Exit 7
FileWrite($hFile, $sInputText)
FileClose($hFile)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
круто работает! только как записывать не в исходный файл, а создавать новый из скомбинированного?
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Tosyk сказал(а):
как записывать не в исходный файл, а создавать новый из скомбинированного?
Может еще в отдельную папку запулить?
Вы выкладывайте все свои желания сразу и в шапке темы.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
xXx сказал(а):
Tosyk сказал(а):
как записывать не в исходный файл, а создавать новый из скомбинированного?
Может еще в отдельную папку запулить?
Вы выкладывайте все свои желания сразу и в шапке темы.
нет, прошу прощения, я подумал что смогу сам добавить это, но что-то не могу разобраться
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Tosyk сказал(а):
создавать новый из скомбинированного?
Код:
If Not $CmdLine[0] Then Exit 1
Global $sInputPath, $sInputText, $hSearch, $sSkelFile, $hFile, $sOutputFile = '*_(New).ascii' ; Новый файл

$sInputPath = StringRegExp($CmdLine[1], '(?i)(.+\\)(([^\\_]+_)[^\\]+\.ascii)$', 1)
If @error Or StringRegExp($sInputPath[1], '(?i)_skel\.ascii$') Then Exit 2
$sInputText = FileRead($CmdLine[1])
If @error Then Exit 3
$sOutputFile = $sInputPath[0] & StringRegExpReplace($sInputPath[1], '(.+)\.ascii$', '$1') & StringTrimLeft($sOutputFile, 1)
$hSearch = FileFindFirstFile($sInputPath[0] & $sInputPath[2] & '*_skel.ascii')
If $hSearch = -1 Then Exit 4
$sSkelFile = FileFindNextFile($hSearch)
If @error Then Exit 5
FileClose($hSearch)
$sSkelText = FileRead($sInputPath[0] & $sSkelFile)
If @error Then Exit 6
$sSkelText = StringStripWS($sSkelText, 1 + 2)
$sInputText = StringRegExpReplace($sInputText, '\A\s*(0\s*)', $sSkelText & @CRLF, 1)
If Not @extended Then Exit 7
If FileExists($sOutputFile) And MsgBox(262144 + 4 + 48, 'Внимание!', 'Файл: "' & @LF & _
		$sOutputFile & '" уже существует.' & @LF & 'Хотите его перезаписать?') = 7 Then Exit 8
$hFile = FileOpen($sOutputFile, 2)
If $hFile = -1 Then Exit 9
FileWrite($hFile, $sInputText)
FileClose($hFile)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
только как записывать не в исходный файл, а создавать новый из скомбинированного?
Код:
#include <File.au3>

$NewFile=@ScriptDir&'\NewFile.ascii'
$FullPath = $CmdLine[1]
$Filename = StringRegExp($FullPath, '(^.*)\\(.*)\.(.*)$', 3)
$FileName2 = StringRegExpReplace($FullPath, ".+\\(.+)\_.+", "\1", 1)
$File2 = _FileListToArray($Filename[0] & '\', $FileName2 & '_*_skel.' & $Filename[2], 1)
If Not @error Then
	$TextFile1=StringTrimLeft(FileRead($FullPath),1)
	$TextFile2 = FileRead($File2[1])
	FileWrite($NewFile,$TextFile2&$TextFile1)
	;_FileWriteToLine($FullPath, 1, $TextFile2, 1)
	_FileDeleteEmptyLines($NewFile)
Else
	MsgBox(16, 'Ошибка', 'Не найден файл для замены')
EndIf

Func _FileDeleteEmptyLines($sFile)
    Local $sFileContent = StringRegExpReplace(FileRead($sFile), "(\r?\n){1,}", "\1")
    Local $hFOpen = FileOpen($sFile, 2 + FileGetEncoding($sFile))
    FileWrite($hFOpen, StringStripWS($sFileContent, 3))
    FileClose($hFOpen)
EndFunc
Или каждый раз нужно спрашивать имя нового файла ?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
ra4o сказал(а):
Или каждый раз нужно спрашивать имя нового файла ?
нет, этого спрашивать не нужно.

ra4o, xXx спасибо огромное! всё отлично работает и мне удалось интегрировать в свой скрипт:
Код:
#include <File.au3>

AutoItSetOption("MustDeclareVars", 1)

Func _FileDeleteEmptyLines($sFile)
    Local $sFileContent = StringRegExpReplace(FileRead($sFile), "(\r?\n){1,}", "\1")
    Local $hFOpen = FileOpen($sFile, 2 + FileGetEncoding($sFile))
    FileWrite($hFOpen, StringStripWS($sFileContent, 3))
    FileClose($hFOpen)
EndFunc

Local $i
Local $sSourceFile, $sDestFile, $sDestPath, $sExePath, $Dir, $sReadFileModel, $sReadFileSkelet, $sWriteFile, $sReadFileModel2, $sOutputFile
Local $sDrive, $sFolder, $sFileName, $sExt, $sParams, $sRunWait, $TextFile1, $TextFile2

If $CmdLine[0] <> 0 Then
   ProgressOn("Converting", "", "0%")
   For $i = 1 To $CmdLine[0]
	  $sSourceFile = $CmdLine[$i]
	  _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
	  ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")
	  If FileExists($sSourceFile) Then
		 $sOutputFile = @WorkingDir & '\' & $sFileName & '_rigged.ascii'
		 $sReadFileModel = StringRegExp($sSourceFile, '(^.*)\\(.*)\.(.*)$', 3)
		 $sReadFileModel2 = StringRegExpReplace($sSourceFile, ".+\\(.+)\_.+", "\1", 1)
		 $sReadFileSkelet = _FileListToArray($sReadFileModel[0] & '\', $sReadFileModel2 & '_*_skel.' & $sReadFileModel[2], 1)

		 If Not @error Then
			$TextFile1 = StringTrimLeft(FileRead($sSourceFile),1)
			$TextFile2 = FileRead($sReadFileSkelet[1])
			FileWrite($sOutputFile,$TextFile2&$TextFile1)
			_FileDeleteEmptyLines($sOutputFile)

		 Else
			MsgBox(16, 'Error', "File [" & $sSourceFile & "] not found")
		 EndIf
   Else
	  MsgBox(0, 'Error', "File [" & $sSourceFile & "] not found")
   EndIf

   Next
   ProgressSet(100, "Converting complete", "100%")

   Sleep(1000)
   ProgressOff()
Else
   MsgBox(0, "Usage", "Drop ASCII file(s) on " & @ScriptName)
   ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit (0)
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Tosyk сказал(а):
мне удалось интегрировать в свой скрипт:
Запустите 2-3 раза с одними и теми же файлами ваш скрипт и посмотрите результат. ;)
 
Верх