Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Поиск строки по слову и добавление новой строки после найденой.

Ответить
Настройки темы
CMD/BAT - Поиск строки по слову и добавление новой строки после найденой.

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Уважаемые, пожалуйста окажите помощь!

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

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

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".

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

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

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

Отправлено: 23:36, 25-05-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Пробуйте:
читать дальше »
Код: Выделить весь код
@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 ==========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:06, 26-05-2013 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Супер! Спасибо большое!
Работает!
Единственно, что добавляет запись в ту же строку.
Попробую добавить перевод строки.

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

Отправлено: 00:19, 26-05-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Mikhael2011:
Единственно, что добавляет запись в ту же строку. »
Э… Я понял фразу:
Цитата Mikhael2011:
и добавить после каждой такой строки строку с определенным текстом. »
именно как «добавить в конец той же строки».

Пробуйте:
читать дальше »
Код: Выделить весь код
@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 ==========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:54, 26-05-2013 | #4


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Теперь просто идеально.
Не знаю как и благодарить.
Вы мне очень помогли. Спасибо!

Отправлено: 01:12, 26-05-2013 | #5


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 02:07, 26-05-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:27, 26-05-2013 | #7


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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%

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

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

Отправлено: 15:35, 26-05-2013 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Georgio:
возникала проблема с точкой с запятой (";") »
Код: Выделить весь код
"eol="
В документации ни Windows XP, ни Windows 7 об этом не сказано, но действует умолчание — «;»: For /f - Loop through text | SS64.com.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:55, 26-05-2013 | #9


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
@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%

Последний раз редактировалось Georgio, 28-05-2013 в 09:34. Причина: уточнение


Отправлено: 03:46, 27-05-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Поиск строки по слову и добавление новой строки после найденой.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск и удаление строк, содержащих перевод строки после двоеточия SergeyVD Скриптовые языки администрирования Windows 3 14-03-2012 22:36
CMD/BAT - добавление строки в в файл Hunterus Скриптовые языки администрирования Windows 1 10-11-2011 22:02
CMD/BAT - [решено] Поиск и удаление строки в файле по сложным условиям m0nkrus Скриптовые языки администрирования Windows 9 26-06-2011 10:37
.NET - DataGrid запрет добавления новой строки Delirium Программирование и базы данных 0 04-03-2011 08:50
MSFT SQL Server - [решено] Создание новой строки по таймеру без внешней программы HohOl78 Программирование и базы данных 2 09-09-2008 23:32




 
Переход