Компьютерный форум 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=252926)

xviioszone 01-02-2013 15:57 2080232

Вставка строк в текстовый файл с определенной позиции.
 
Вложений: 1
Здравствуйте.
Помогите написать cmd или vbs скрипт.
Необходимо организовать вставку в текстовые файлы (DXF) 4-х строк, начиная с 6-й строки.


Вставляемые строки:
$ACADVER
1
AC1009
9


Спасибо.

Приложен пример файла для обработки

zion87 01-02-2013 17:36 2080308

Код:

@echo off
echo working
set n=0
set file=test.dxf
set temp=test.txt
for /f "delims=*" %%i in (' more +%n% %file% ') do call :1 "%%i"
:next
echo $ACADVER >>%temp%
echo  1 >>%temp%
echo AC1009 >>%temp%
echo  9 >>%temp%
for /f "delims=*" %%s in (' more +5 %file% ') do echo %%s >>%temp%
del %file% && ren %temp% %file%
exit
:1
set /a n+=1
set s=%1
echo %s:~1,-1% >>%temp%
if %n% == 5 goto :next


xviioszone 02-02-2013 17:25 2080981

zion87,
Вроде работает, но ужасно долго идет обработка... :(

Быстрее руками в текстовом редакторе получается

zion87 02-02-2013 17:33 2080992

Пожалуйста

там 4300 строк

Iska 02-02-2013 19:43 2081107

Цитата:

Цитата xviioszone
но ужасно долго идет обработка...
Быстрее руками в текстовом редакторе получается »

Вы сами указали категорию:
Цитата:

Цитата xviioszone
CMD/BAT »


megaloman 02-02-2013 20:41 2081153

Цитата:

Помогите написать cmd или vbs скрипт.
Код:

Ins = Array("$ACADVER", "1", "AC1009", "9")    ' Какие строки вставляем
nIns = 6                                        ' После какой строки
NFile = "E:\Test\test.dxf"                      ' В каком файле
ToFile = "E:\Test\test2.dxf"                    ' В какой файл. Имена могут совпадать

AllIns = ""
For i = 0 To UBound(Ins)
    AllIns = AllIns + Ins(i) + vbCrLf
Next

Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.OpenTextFile(NFile, 1, False)
AllTxt = F.ReadAll
F.Close

Beg = 0
For i = 1 To 6
    Beg = InStr(Beg + 1, AllTxt, vbCrLf)
Next

Set F = FSO.OpenTextFile(ToFile, 2, True)
F.Write (Mid(AllTxt, 1, Beg + 1) + AllIns + Mid(AllTxt, Beg + 2))
F.Close


megaloman 02-02-2013 21:35 2081204

Вроде бы недолго, руками точно дольше
Код:

@Echo Off

Set NFile=E:\Test\test.dxf

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Del "%NFile%.~TMP" >nul 2>nul

Set N=0
FOR /F "usebackq delims=" %%s IN ("%NFile%") DO (
        @Echo %%s>>"%NFile%.~TMP"
        Set /A N=!N!+1
        If !N! EQU 6 (
                >>"%NFile%.~TMP" Echo $ACADVER
                >>"%NFile%.~TMP" Echo 1
                >>"%NFile%.~TMP" Echo AC1009
                >>"%NFile%.~TMP" Echo 9
        )
)

rem Move /Y "%NFile%.~TMP" "%NFile%"

Делается вспомогательный файл, затем он заменяет исходный. Для отладки это действие заремлено.
Меня напрягает, что в конце вставляемых строк получается лишний пробел, хотя, возможно, для данного случая это не существенно
я исправил решение в соответствии с предложенным исправлением от Iska - спасибо большое.

Iska 02-02-2013 22:37 2081253

Цитата:

Цитата megaloman
Меня напрягает, что в конце вставляемых строк получается лишний пробел, »

Код:

                >>"%NFile%.~TMP" Echo $ACADVER"
                >>"%NFile%.~TMP" Echo 1
                >>"%NFile%.~TMP" Echo AC1009
                >>"%NFile%.~TMP" Echo 9

А лучше целиком вынести перенаправление вывода наружу, наподобие:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=test.dxf

call :GetTemporaryName

set /a iCount = 1

>"%TemporaryName%" (
        for /f "usebackq delims=" %%s in ("%sFile%") do (
                if !iCount! equ 6 (
                        echo $ACADVER
                        echo 1
                        echo AC1009
                        echo 9
                )
                echo %%s
               
                set /a iCount += 1
        )
)

if exist "%sFile%.bak" del "%sFile%.bak"
ren "%sFile%" "%sFile%.bak"
copy "%TemporaryName%" "%sFile%"
del "%TemporaryName%"

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
    setlocal enableextensions enabledelayedexpansion

:NextName
    set sTempName=%temp%\temp%random%.tmp

    if exist "%sTempName%" goto :NextName

    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sTempName%
    exit /b 0
rem ==========================================================================



Время: 20:24.

Время: 20:24.
© OSzone.net 2001-