PDA

Показать полную графическую версию : [решено] Вставка строк в текстовый файл с определенной позиции.


xviioszone
01-02-2013, 15:57
Здравствуйте.
Помогите написать cmd или vbs скрипт.
Необходимо организовать вставку в текстовые файлы (DXF) 4-х строк, начиная с 6-й строки.


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


Спасибо.

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

zion87
01-02-2013, 17:36
@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
zion87,
Вроде работает, но ужасно долго идет обработка... :(

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

zion87
02-02-2013, 17:33
Пожалуйста

там 4300 строк

Iska
02-02-2013, 19:43
но ужасно долго идет обработка...
Быстрее руками в текстовом редакторе получается »
Вы сами указали категорию:
CMD/BAT »

megaloman
02-02-2013, 20:41
Помогите написать 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
Вроде бы недолго, руками точно дольше @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
Меня напрягает, что в конце вставляемых строк получается лишний пробел, »
>>"%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 ==========================================================================




© OSzone.net 2001-2012