xviioszone |
01-02-2013 15:57 2080232 |
Вставка строк в текстовый файл с определенной позиции.
Вложений: 1
Здравствуйте.
Помогите написать cmd или vbs скрипт.
Необходимо организовать вставку в текстовые файлы (DXF) 4-х строк, начиная с 6-й строки.
Вставляемые строки:
$ACADVER
1
AC1009
9
Спасибо.
Приложен пример файла для обработки
|
Код:
@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,
Вроде работает, но ужасно долго идет обработка... :(
Быстрее руками в текстовом редакторе получается
|
Пожалуйста
там 4300 строк
|
Цитата:
Цитата xviioszone
но ужасно долго идет обработка...
Быстрее руками в текстовом редакторе получается »
|
Вы сами указали категорию:
|
Цитата:
Помогите написать 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
|
Вроде бы недолго, руками точно дольше
Код:
@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 - спасибо большое.
|
Цитата:
Цитата 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.
© OSzone.net 2001-