Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   копировать или вырезать строки в последовательном порядке (http://forum.oszone.net/showthread.php?t=324941)

temphard 17-03-2017 01:39 2720214

копировать или вырезать строки в последовательном порядке
 
Здравствуйте.
Необходима реализация следующего скрипта:

Существует два файла: 1.txt и 2.txt.
Нужно из файла 1.txt копировать или вырезать строки в последовательном порядке (сверху в низ) и вставлять их в файл 2.txt вместо пустых строк, но чтобы также последовательно (сверху вниз).
В файле 1.txt содержаться подготовленные строки, пустых строк нету.
В файле 2.txt находится информация, которая разделена пустыми строками.

То есть пошагово процесс происходит следующим образом:
Скрипт из файла 1.txt копирует или вырезает первую сверху строку (целиком) и вставляет ее в файл 2.txt вместо первой попавшейся (сверху в низ) пустой строки. Затем возвращается к файлу 1.txt копирует или вырезает следующую строку (если было вырезание, значит следующая строка всегда будет первой) и процесс повторяется до полного завершения.

Возможно ли в принципе такое реализовать? Или это всего лишь нереальные мечтания?
Заранее благодарен за помощь.

Iska 17-03-2017 02:45 2720220

Пример покажите: файл 1.txt, файл 2.txt, результирующий файл.

glukin 17-03-2017 07:55 2720244

temphard, Вам обязательно на cmd/bat?
Вообще - это легко алгоритмизируемая задача, исполняемая на любом языке программирования, в том числе и на vbs.

temphard 17-03-2017 13:08 2720346

Вложений: 3
Цитата:

Цитата Iska
Пример покажите: файл 1.txt, файл 2.txt, результирующий файл. »

Здесь пример содержимого файлов 1.txt и 2.txt.
В файле 1.txt двенадцать строк, которые необходимо скопировать/вырезать и вставить их в файл 2.txt, в котором кроме прочей информации существует двенадцать пустых строк.
В файле 3.txt отображен конечный результат.

temphard 17-03-2017 13:09 2720347

Цитата:

Цитата glukin
Вам обязательно на cmd/bat? »

Да, в данном случае подойдет только cmd/bat.

Iska 17-03-2017 13:24 2720352

Цитата:

Цитата temphard
Да, в данном случае подойдет только cmd/bat. »

Почему? Обоснуйте.

temphard 17-03-2017 14:11 2720364

Цитата:

Цитата Iska
Почему? Обоснуйте. »

Я не отрицаю, что данную задачу можно (и возможно это проще и практичнее) реализовать на любом языке программирования, в том числе и на vbs.
Я имею ввиду, что немного знаком и имею небольшой опыт использования лишь cmd/bat, поэтому предпочитаю этот способ.
На мой взгляд cmd/bat легко редактировать и изменять под разные нужды.
Если можно по другому, то как именно, легко ли этим пользоваться и что для этого нужно?
Спасибо за понимание.

Iska 17-03-2017 14:24 2720368

На WSH.

Медленнее, но меньше памяти
Код:

Option Explicit

Dim strSource1File
Dim strSource2File
Dim strDestFile

Dim objSource1TS
Dim objSource2TS
Dim objDestTS

Dim strSource1Line, strSource2Line


strSource1File = "C:\Мои проекты\0052\01.txt"
strSource2File = "C:\Мои проекты\0052\02.txt"
strDestFile    = "C:\Мои проекты\0052\04.txt"

With WScript.CreateObject("Scripting.FileSystemObject")
        Set objSource1TS = .OpenTextFile(strSource1File)
        Set objSource2TS = .OpenTextFile(strSource2File)
        Set objDestTS    = .CreateTextFile(strDestFile, True)
       
        If Not objSource1TS.AtEndOfStream Then
                strSource1Line = objSource1TS.ReadLine()
        Else
                WScript.Quit 1
        End If
               
        Do
                If Not objSource2TS.AtEndOfStream Then
                        strSource2Line = objSource2TS.ReadLine()
                       
                        If Len(Trim(strSource2Line)) = 0 Then
                                objDestTS.WriteLine strSource1Line
                               
                                If Not objSource1TS.AtEndOfStream Then
                                        strSource1Line = objSource1TS.ReadLine()
                                Else
                                        strSource1Line = ""
                                End If
                        Else
                                objDestTS.WriteLine strSource2Line
                        End If
                Else
                        Exit Do
                End If
        Loop
       
        objDestTS.Close
        objSource2TS.Close
        objSource1TS.Close
       
        Set objDestTS    = Nothing
        Set objSource2TS = Nothing
        Set objSource1TS = Nothing
End With

WScript.Quit 0


Быстрее, но больше памяти
Код:

Option Explicit

Dim strSource1File
Dim strSource2File
Dim strDestFile

Dim arrSource1Content
Dim arrSource2Content

Dim iSource1Count, iSource2Count


strSource1File = "C:\Мои проекты\0052\01.txt"
strSource2File = "C:\Мои проекты\0052\02.txt"
strDestFile    = "C:\Мои проекты\0052\04.txt"

With WScript.CreateObject("Scripting.FileSystemObject")
        With .OpenTextFile(strSource1File)
                arrSource1Content = Split(.ReadAll(), vbCrLf)
                .Close
        End With
       
        With .OpenTextFile(strSource2File)
                arrSource2Content = Split(.ReadAll(), vbCrLf)
                .Close
        End With
       
        iSource2Count = LBound(arrSource2Content)
       
        For iSource1Count = LBound(arrSource1Content) To UBound(arrSource1Content)
                Do
                        If Len(Trim(arrSource2Content(iSource2Count))) = 0 Then
                                arrSource2Content(iSource2Count) = arrSource1Content(iSource1Count)
                                Exit Do
                        End If
                       
                        iSource2Count = iSource2Count + 1
                       
                        If iSource2Count > UBound(arrSource2Content) Then
                                Exit For
                        End If
                Loop
        Next
       
        With .CreateTextFile(strDestFile, True)
                .Write Join(arrSource2Content, vbCrLf)
                .Close
        End With
End With

WScript.Quit 0


Будете проверять на тех образцах, что Вы выложили — имейте в виду, что у Вас там две одиннадцатых строки :).

temphard 17-03-2017 14:46 2720383

Цитата:

Цитата Iska
На WSH »

Спасибо. Работает!
Я создал текстовый файл, поместил в него скрипт и сохранил с расширением *.vbs - Это правильно?
Но главное, что это работает! Удивительно!
Оказывается cmd/bat - это всего лишь небольшая часть "вселенной" скриптов.
Балгодарю.
P.S.
Цитата:

Цитата Iska
там две одиннадцатых строки »

...верно, это техническая ошибка.

Iska 17-03-2017 14:57 2720389

Цитата:

Цитата temphard
Я создал текстовый файл, поместил в него скрипт и сохранил с расширением *.vbs - Это правильно? »

Да.

Цитата:

Цитата temphard
Но главное, что это работает! Удивительно! »

Можете поиграться с вариантами «исходных строк меньше/больше, чем пустых». Я не проверял.

alpap 22-03-2017 12:22 2722013

На cmd, скорость не проверял, сделал для примера (чтобы не потерять, а кому-то может и пригодится):
Код:

@echo off
set "f1=01.txt"
set "f2=02.txt"
set "f3=03.txt"
set n=-1
<"%f2%">"%f3%" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do @(
  if not "%%b"=="" (<nul set /p="%%b"& echo:) else (call :#)
 )
)
exit

:#
 @set /a n+=1
 @<"%f1%" (more +%n%|set/p s=^& cmd/v/c "if defined s (<nul set /p="!s!"& echo:) else (echo:)")
@exit /b



Время: 05:51.

Время: 05:51.
© OSzone.net 2001-