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

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 103
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.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
« Последнее редактирование: Март 08, 2019, 16:46:21 от Tosyk »

Русское сообщество AutoIt


Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 103

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
попытался поискать в английском интернете. нашёл такое:
https://stackoverflow.com/questions/8558483/copying-the-contents-of-file-to-another

Код: AutoIt [Выделить]
;$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. возможно можно как-то адаптировать этот код?

помогите пожалуйста :)

Оффлайн ЭйчЭйч [?]

  • Сообщений: 109
  • Репутация: -1
    • Награды
  • Версия AutoIt: 3.3.14.0
Может тебе нужно удалить 0 и дописать в начало файла с сохранением остального содержания?

Оффлайн ra4o [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 918
  • Репутация: 169
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
имя может быть любым, сейчас оно "1E5"
После имени всегда знак подчёркивания  "_" ?

Русское сообщество AutoIt


Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 103

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
имя может быть любым, сейчас оно "1E5"
После имени всегда знак подчёркивания  "_" ?
да


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

Код: AutoIt [Выделить]
#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)

« Последнее редактирование: Март 10, 2019, 19:31:10 от Tosyk, Причина: Объединение сообщений »

Оффлайн ra4o [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 918
  • Репутация: 169
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Не знаю - правильно ли я Вас понял, но вот , попробуйте мой вариант . Перетаскивайте файл , например "1E5_111.ascii" на скомпилированый скрипт и он заменит первую строку содержимым второго файла.Так
Цитировать
я хочу чтобы это было через drag&drop: я тащу 1E5_111.ascii на EXE, этот EXE ищет в папке "1E5_*_skel.ascii" и использует его.
( Функцию по удалению пустых строк из файла взял у CreatoR )
(нажмите для показа/скрытия)

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 17
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
До кучи мой вариант:
(нажмите для показа/скрытия)

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 103

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
круто работает! только как записывать не в исходный файл, а создавать новый из скомбинированного?

Русское сообщество AutoIt


Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 17
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
как записывать не в исходный файл, а создавать новый из скомбинированного?
Может еще в отдельную папку запулить?
Вы выкладывайте все свои желания сразу и в шапке темы.

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 103

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

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 17
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
создавать новый из скомбинированного?
(нажмите для показа/скрытия)
« Последнее редактирование: Март 10, 2019, 23:31:46 от xXx »

Помечен как лучший ответ пользователем Tosyk Отправлен Март 10, 2019, 23:55:37

Оффлайн ra4o [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 918
  • Репутация: 169
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
только как записывать не в исходный файл, а создавать новый из скомбинированного?
(нажмите для показа/скрытия)
Или каждый раз нужно спрашивать имя нового файла ?

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 103

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Или каждый раз нужно спрашивать имя нового файла ?
нет, этого спрашивать не нужно.

ra4o, xXx спасибо огромное! всё отлично работает и мне удалось интегрировать в свой скрипт:
Код: AutoIt [Выделить]
#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 [?]

  • Новичок
  • *
  • Сообщений: 59
  • Репутация: 17
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
мне удалось интегрировать в свой скрипт:
Запустите 2-3 раза с одними и теми же файлами ваш скрипт и посмотрите результат. ;)

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
4309 Просмотров
Последний ответ Июль 30, 2012, 16:12:23
от warezoogle3
7 Ответов
3732 Просмотров
Последний ответ Апрель 04, 2013, 16:55:34
от Юрий
24 Ответов
8689 Просмотров
Последний ответ Март 18, 2014, 02:39:50
от Dk
14 Ответов
3658 Просмотров
Последний ответ Май 27, 2015, 16:55:29
от Tapok
30 Ответов
8487 Просмотров
Последний ответ Июнь 13, 2015, 09:18:25
от mikzin
1 Ответов
1025 Просмотров
Последний ответ Октябрь 22, 2015, 14:43:28
от madmasles
1 Ответов
1137 Просмотров
Последний ответ Июль 12, 2016, 12:23:26
от pvnn
1 Ответов
617 Просмотров
Последний ответ Май 29, 2017, 11:47:58
от InnI
4 Ответов
643 Просмотров
Последний ответ Август 16, 2017, 10:00:08
от Alofa
14 Ответов
839 Просмотров
Последний ответ Февраль 08, 2018, 20:19:37
от Serega1383