PDA

Показать полную графическую версию : Поиск строки по слову и добавление новой строки после найденой.


Mikhael2011
25-05-2013, 23:36
Уважаемые, пожалуйста окажите помощь!

Задача такова:

Есть текстовый файл примерно такого вида:

12:40:18;2448;DFEGB;FDSF
12:43:04;8393;;RAAI 18
12:43:25;24897;LKUY;KJLLKO
12:47:16;28627;;MIHIUH
12:47:20;29572;KLKGHJHr;SAGFHAY
;8489;ADVB;In 2;0:00:03
;31027;ADVB;DBXL2312;0:00:09
;30830;ADVB;DBXL2271;0:00:20
;31044;ADVB;DBXL2315;0:00:12
;31026;ADVB;DBXL2311;0:00:09
;31052;ADVB;DBXL2317;0:00:15
;30436;ADVB;DBXL2200;0:00:27
;31017;ADVB;DBXL2309;0:00:13
;8499;ADVB;Out 2;0:00:05
12:53:48;29961;FDKQ;HHKJHIK
12:57:43;26093;;HJHKJHAW
и т.д.

Необходимо написать батник, которому передается название этого текстового файла.

В нем нужно найти строки содержащие текст "DBXL" и добавить после каждой такой строки строку с определенным текстом.
Например ";VSTAVKA".

Обработанный файл нужно сохранить под тем же именем.

Возможно кто то уже сталкивался с похожей задачей.
Буду весьма благодарен за любую подсказку.

Заранее огромное спасибо!

Iska
26-05-2013, 00:06
Пробуйте:
@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~1
set sString4Find=DBXL
set sString4Append=;VSTAVKA

call :GetTemporaryName

if defined sFile (
if exist "%sFile%" (
for /f "usebackq eol= delims=" %%i in ("%sFile%") do (
echo %%i| >nul find.exe "%sString4Find%" && (
>>"%TemporaryName%" echo %%i%sString4Append%
) || (
>>"%TemporaryName%" echo %%i
)
)

if exist "%sFile%.bak" del /f /q "%sFile%.bak"
ren "%sFile%" "%sFile%.bak"
copy /y "%TemporaryName%" "%sFile%"
del /f /q "%TemporaryName%"
) else (
echo Source file [%sFile%] not found.
)
) else (
echo Usage: %~nx0 ^<source file^>
)

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 ==========================================================================

Mikhael2011
26-05-2013, 00:19
Супер! Спасибо большое!
Работает!
Единственно, что добавляет запись в ту же строку.
Попробую добавить перевод строки.

еще раз благодарю!

Iska
26-05-2013, 00:54
Единственно, что добавляет запись в ту же строку. »
Э… Я понял фразу:
и добавить после каждой такой строки строку с определенным текстом. »
именно как «добавить в конец той же строки».

Пробуйте:
@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~1
set sString4Find=DBXL
set sString4Append=;VSTAVKA

call :GetTemporaryName

if defined sFile (
if exist "%sFile%" (
for /f "usebackq eol= delims=" %%i in ("%sFile%") do (
echo %%i| >nul find.exe "%sString4Find%" && >>"%TemporaryName%" (
echo %%i
echo %sString4Append%
) || (
>>"%TemporaryName%" echo %%i
)
)

if exist "%sFile%.bak" del /f /q "%sFile%.bak"
ren "%sFile%" "%sFile%.bak"
copy /y "%TemporaryName%" "%sFile%"
del /f /q "%TemporaryName%"
) else (
echo Source file [%sFile%] not found.
)
) else (
echo Usage: %~nx0 ^<source file^>
)

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 ==========================================================================

Mikhael2011
26-05-2013, 01:12
Теперь просто идеально.
Не знаю как и благодарить.
Вы мне очень помогли. Спасибо!

Mikhael2011
26-05-2013, 02:07
К сожалению возникла еще одна проблема.
Если в тексте встречается символ &, то батник, судя по всему, считает следующее за ним слово командой.
И соответственно в каждом случае выдает сообщение, что это не является внутренней или внешней командой, исполняемым или пакетным файлом.

Iska
26-05-2013, 06:27
Mikhael2011, поздравляю! Вы созрели для WSH:
Option Explicit

Dim objFSO
Dim objTSSource
Dim objTSDest

Dim strString4Find
Dim strString4Append

Dim strSourceFile
Dim strTempFile
Dim strBackupFile

Dim strLine


If WScript.Arguments.Count = 3 Then
With WScript.CreateObject("Scripting.FileSystemObject")
strSourceFile = .GetAbsolutePathName(WScript.Arguments.Item(0))

If .FileExists(strSourceFile) Then
strString4Find = WScript.Arguments.Item(1)
strString4Append = WScript.Arguments.Item(2)

strTempFile = GetTemporaryName()

Set objTSSource = .OpenTextFile(strSourceFile)
Set objTSDest = .CreateTextFile(strTempFile)

Do Until objTSSource.AtEndOfStream
strLine = objTSSource.ReadLine()

objTSDest.WriteLine strLine

If InStr(1, strLine, strString4Find, vbTextCompare) > 0 Then
objTSDest.WriteLine strString4Append
End If
Loop

objTSDest.Close
objTSSource.Close

Set objTSDest = Nothing
Set objTSSource = Nothing

strBackupFile = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".bak")

.CopyFile strSourceFile, strBackupFile, True
.CopyFile strTempFile, strSourceFile, True
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
End If
End With
Else
WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file> <String for find> <String for append>"
End If

WScript.Quit 0

'=============================================================================
' Серый форум / VBScript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
Const TemporaryFolder = 2

Dim strTempName

With WScript.CreateObject("Scripting.FileSystemObject")
Do
strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
End With

GetTemporaryName = strTempName
End Function
'=============================================================================

Georgio
26-05-2013, 15:35
@ECHO OFF
SET File=My_File.txt
FOR /F "tokens=1* delims=:" %%I IN ('FINDSTR /N /R . %File%') DO (
ECHO %%J|((FINDSTR DBXL>nul&&ECHO %%J>>New_File.txt&&ECHO ;VSTAVKA>>New_File.txt)||ECHO %%J>>New_File.txt)
)
REN %File% %File%.old&&REN New_File.txt %File%

К сожалению, зтот скрипт также "чувствителен" к символу "&". Но эту проблему можно решить, заменив при помощи "Блокнота" все символы "&" в тексте на какой-нибудь другой символ, который не встречается в тексте, или на сочетание символов, которое точно не будет фигурировать в тексте, а после применения скрипта в полученном тексте поменять этот символ или это сочетание символов снова на "&". Только не используйте для замены символы "%", "^", "|" и. т. п., так как они также могут привести к аналогичной ошибке.

Кстати, ещё возникала проблема с точкой с запятой (";") в начале строк, но она была решена.

Iska
26-05-2013, 18:55
возникала проблема с точкой с запятой (";") »
"eol="
В документации ни Windows XP, ни Windows 7 об этом не сказано, но действует умолчание — «;»: For /f - Loop through text | SS64.com (http://ss64.com/nt/for_f.html).

Georgio
27-05-2013, 03:46
"Поборол" "противный" амперсанд (&), а заодно и большинство других "нежелательных" символов. При данном методе "выжили" только кавычки ("), да и то непарные (парные кавычки в середине строк корректно реплицируются, а вот по краям строк "самоликвидируются", что тоже не очень хорошо). Остались также нерешенными проблемы репликации пустых строк и пробелов в начале строк (в т. ч. строк, состоящих из пробелов). Думаю их можно решить другими методами.

@ECHO OFF
SET File=My_File.txt
FOR /F "tokens=1* delims=:" %%I IN ('FINDSTR /N /R . %File%') DO ((
SET /P "VAR=%%J" 0>nul|FINDSTR DBXL>nul&&((SET /P "VAR=%%J" 0>nul&ECHO.&ECHO ;VSTAVKA)>>New_File.txt))||((SET /P "VAR=%%J" 0>nul&ECHO.)>>New_File.txt
))
REN %File% %File%.old&&REN New_File.txt %File%

icq99999999
28-07-2013, 23:51
@echo off setlocal enableextensions enabledelayedexpansion set sFile=%~1 set sString4Find=DBXL set sString4Append=;VSTAVKA call :GetTemporaryName if defined sFile ( if exist "%sFile%" ( for /f "usebackq eol= delims=" %%i in ("%sFile%") do ( echo %%i| >nul find.exe "%sString4Find%" && ( >>"%TemporaryName%" echo %%i%sString4Append% ) || ( >>"%TemporaryName%" echo %%i ) ) if exist "%sFile%.bak" del /f /q "%sFile%.bak" ren "%sFile%" "%sFile%.bak" copy /y "%TemporaryName%" "%sFile%" del /f /q "%TemporaryName%" ) else ( echo Source file [%sFile%] not found. ) ) else ( echo Usage: %~nx0 ^<source file^> ) 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 ========================================================================== »
как добавить в начало всех строк определенный текст ?

Iska
29-07-2013, 00:16
for /f "delims=" %%i in (0001.txt) do echo определенный текст%%i>>0002.txt
Пустые строки исчезнут.

icq99999999
30-07-2013, 14:18
Код: »
имеется файл с таким таким содержанием (пример куска файла)
start /low C:\Windows\comencom.cmd
start /low "C:\Users\User\AppData\Roaming\uTorrent\uTorrent.exe" /MINIMIZED
start /low "C:\Program Files\Skype\Phone\Skype.exe" /minimized /regrun
а мне нужно так
ping -n 4 127.0.0.1 >nul
start /low C:\Windows\comencom.cmd
ping -n 4 127.0.0.1 >nul
start /low "C:\Users\User\AppData\Roaming\uTorrent\uTorrent.exe" /MINIMIZED
ping -n 4 127.0.0.1 >nul
start /low "C:\Program Files\Skype\Phone\Skype.exe" /minimized /regrun
притом строк будет очень много, эти я взял для примера.
то есть мне нужно чтобы перед каждой строкой была ping -n 4 127.0.0.1 >nul

Iska
30-07-2013, 15:01
@echo off
setlocal enableextensions enabledelayedexpansion

>0002.txt (
for /f "delims=" %%i in (0001.txt) do (
echo ping.exe -n 4 127.0.0.1 ^>nul
echo %%i
)
)

endlocal
exit /b 0

icq99999999
30-07-2013, 16:09
Код: »
как добавить в самое начало файла текст который содержит переход на другую строку
то есть по умолчании так
start /low C:\Windows\comencom.cmd
а мне нужно так
@echo off

start /low C:\Windows\comencom.cmd

Iska
30-07-2013, 16:20
@echo off
setlocal enableextensions enabledelayedexpansion

>0002.txt (
echo @echo off
type 0001.txt
)

endlocal
exit /b 0

icq99999999, пользуйте тэг (http://forum.oszone.net/misc.php?do=bbcode#code), дабы выглядело так:
Как добавить в самое начало файла текст, который содержит переход на другую строку. То есть, по умолчанию так:
[code]start /low C:\Windows\comencom.cmd
а мне нужно так:
@echo off
start /low C:\Windows\comencom.cmd »

eggggggr
16-03-2017, 01:47
Подскажите как написать файл который бы в текстовом документе (10гиг) через каждые 15 строк ставил пустую строку или символ-- помогите очень нужно!

Iska
16-03-2017, 03:37
eggggggr, кодировка какая у текстового файла? Если юникод — то какой, и есть ли BOM? Концы строк в каком виде Windows, Unix, Mac?

пустую строку или символ »
Определитесь, что Вам нужно.




© OSzone.net 2001-2012