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

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

Ответить
Настройки темы
CMD/BAT - Изменение строк в файле

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


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

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


Добрый день! Решил усложнить себе жизнь и начать оптимизировать некоторые процессы. Поэтому буду премного благодарен за ответ с комментариями, что где и почему пишем) Задача: в папке сложены Файлы 1, 2, 3... 1000. Формат txt. В этих файлах есть текст. Во всех разный. При этом есть строка (чаще первая) в которой написано «ааа_1#0», где 1 это число которое необходимо оставить, а все остальное надо (что в ковычках) надо удалить. Как это сделать через исполнительный файл, ибо файликов таких очень много??? Количество символов в ковычках всегда разное. Нужная комбинации всегда окружена _ и #

Отправлено: 15:32, 07-06-2018

 

Ветеран


Contributor


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

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


Nikugorsk, упаковываете несколько таких файлов в архив, который прилагаете к сообщению. Дальше смотрим.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:41, 07-06-2018 | #2



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

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


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


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

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


Вложения
Тип файла: txt 1657.txt
(175 байт, 8 просмотров)
Тип файла: txt 1664.txt
(118 байт, 5 просмотров)

Цитата Iska:
Nikugorsk, упаковываете несколько таких файлов в архив, который прилагаете к сообщению. Дальше смотрим.
Приложил

Отправлено: 16:42, 07-06-2018 | #3


Ветеран


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

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


Nikugorsk,
нужны файлы с разным содержимым или если знаете неплохо содержимое, есть ли в файле строка(и) с похожим содержимым кроме этой строки: 7,2 "Центр_1664#0", т.е если искать по символу _ или # или обеим или по кавычкам - гарантированно будет найдена только одна эта строка?
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:43, 07-06-2018 | #4


Ветеран


Contributor


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

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


И ещё, к словам коллеги: случайно ли то, что искомые цифры в файле совпадают с именем файла?

Отправлено: 17:53, 07-06-2018 | #5


Ветеран


Contributor


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

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


На WSH:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim objRegExp
Dim strContent

If WScript.Arguments.Count = 1 Then
	strSourceFolder = WScript.Arguments.Item(0)
	
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	If objFSO.FolderExists(strSourceFolder) Then
		Set objRegExp = WScript.CreateObject("VBScript.RegExp")
		
		With objRegExp
			.Pattern    = "^(.+ "")(?:.+_)(\d+)(?:#)(.+"")$"
			.Global     = True
			.MultiLine  = True
		End With
		
		For Each objFile In objFSO.GetFolder(strSourceFolder).Files
			If StrComp(objFSO.GetExtensionName(objFile.Name), "txt", 0) = 0 Then
				With objFSO.OpenTextFile(objFile.Path)
					strContent = .ReadAll()
					.Close
				End With
				
				If objRegExp.Test(strContent) Then
					objFSO.CopyFile objFile.Name, objFSO.GetBaseName(objFile.Name) & ".bak", True
					
					With objFSO.CreateTextFile(objFile.Name, True)
						.Write objRegExp.Replace(strContent, "$1$2$3")
						.Close
					End With
				Else
					' Nothing to do
				End If
			Else
				' Nothing to do
			End If
		Next
		
		Set objRegExp = Nothing
	Else
		WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
	WScript.Quit 1
End If

WScript.Quit 0

Исходная папка указывается аргументом скрипта (также можно просто перетащить папку на скрипт в Проводнике). Будут обработаны все *.txt файлы из указанной папки. При нахождении шаблона в содержимом текстового файла и последующей замене делается резервная копия исходного файла с расширением .bak.

Согласно изложенным Вами выше правилам поиска и замены в выложенных для примера файлах произойдут следующие замены — в 1657.txt:
Код: Выделить весь код
11,2 "Центр_1657#0"
на:
Код: Выделить весь код
11,2 "16570"
и в 1664.txt:
Код: Выделить весь код
7,2 "Центр_1664#0"
на:
Код: Выделить весь код
7,2 "16640"
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:31, 07-06-2018 | #6


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


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

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


Цитата alpap:
Nikugorsk,
нужны файлы с разным содержимым или если знаете неплохо содержимое, есть ли в файле строка(и) с похожим содержимым кроме этой строки: 7,2 "Центр_1664#0", т.е если искать по символу _ или # или обеим или по кавычкам - гарантированно будет найдена только одна эта строка?

Да, гарантированно найдётся только эта строка. По любому из 3х признаков.

Цитата Iska:
На WSH:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim objRegExp
Dim strContent

If WScript.Arguments.Count = 1 Then
	strSourceFolder = WScript.Arguments.Item(0)
	
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	If objFSO.FolderExists(strSourceFolder) Then
		Set objRegExp = WScript.CreateObject("VBScript.RegExp")
		
		With objRegExp
			.Pattern    = "^(.+ "")(?:.+_)(\d+)(?:#)(.+"")$"
			.Global     = True
			.MultiLine  = True
		End With
		
		For Each objFile In objFSO.GetFolder(strSourceFolder).Files
			If StrComp(objFSO.GetExtensionName(objFile.Name), "txt", 0) = 0 Then
				With objFSO.OpenTextFile(objFile.Path)
					strContent = .ReadAll()
					.Close
				End With
				
				If objRegExp.Test(strContent) Then
					objFSO.CopyFile objFile.Name, objFSO.GetBaseName(objFile.Name) & ".bak", True
					
					With objFSO.CreateTextFile(objFile.Name, True)
						.Write objRegExp.Replace(strContent, "$1$2$3")
						.Close
					End With
				Else
					' Nothing to do
				End If
			Else
				' Nothing to do
			End If
		Next
		
		Set objRegExp = Nothing
	Else
		WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
	WScript.Quit 1
End If

WScript.Quit 0

Исходная папка указывается аргументом скрипта (также можно просто перетащить папку на скрипт в Проводнике). Будут обработаны все *.txt файлы из указанной папки. При нахождении шаблона в содержимом текстового файла и последующей замене делается резервная копия исходного файла с расширением .bak.

Согласно изложенным Вами выше правилам поиска и замены в выложенных для примера файлах произойдут следующие замены — в 1657.txt:
Код: Выделить весь код
11,2 "Центр_1657#0"
на:
Код: Выделить весь код
11,2 "16570"
и в 1664.txt:
Код: Выделить весь код
7,2 "Центр_1664#0"
на:
Код: Выделить весь код
7,2 "16640"
А как 0 в конце убрать? Должен остаться только 1657 и 1664

Цитата Iska:
И ещё, к словам коллеги: случайно ли то, что искомые цифры в файле совпадают с именем файла?
Это частный случай. Для примера

Отправлено: 20:11, 07-06-2018 | #7


Ветеран


Contributor


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

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


Цитата Nikugorsk:
А как 0 в конце убрать? Должен остаться только 1657 и 1664 »
Тогда замените строку:
Код: Выделить весь код
			.Pattern    = "^(.+ "")(?:.+_)(\d+)(?:#)(.+"")$"
на:
Код: Выделить весь код
			.Pattern    = "^(.+ "")(?:.+_)(\d+)(?:#.+)("")$"
Цитата Nikugorsk:
Это частный случай. Для примера »
Ясно.

Отправлено: 20:18, 07-06-2018 | #8


Аватара для YuS_2

Старожил


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

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


Цитата Nikugorsk:
Как это сделать через исполнительный файл, ибо файликов таких очень много??? »
powershell
script.ps1
Код: Выделить весь код
dir *.txt -file|%{
	(gc $_.fullname -enc default) -replace '(?<=\")[^_]*_|#[^"]*(?=\")'|`
	set-content ($_.fullname) -enc default
}
Для запуска скрипта:
run.bat
Код: Выделить весь код
@echo off
echo.Поехали
powershell -ex bypass .\script.ps1
echo.Приехали
pause

-------
scio me nihil scire

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:29, 07-06-2018 | #9


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


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

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


Изображения
Тип файла: png 207C8855-578B-408E-8EBC-4C0C10904E0D.png
(63.4 Kb, 5 просмотров)

Цитата YuS_2:
Цитата Nikugorsk:
Как это сделать через исполнительный файл, ибо файликов таких очень много??? »
powershell
script.ps1
Код: Выделить весь код
dir *.txt -file|%{
	(gc $_.fullname -enc default) -replace '(?<=\")[^_]*_|#[^"]*(?=\")'|`
	set-content ($_.fullname) -enc default
}
Для запуска скрипта:
run.bat
Код: Выделить весь код
@echo off
echo.Поехали
powershell -ex bypass .\script.ps1
echo.Приехали
pause
Не получается

Отправлено: 07:08, 08-06-2018 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Нумерация строк в файле ВиталийВ Скриптовые языки администрирования Windows 2 25-09-2015 19:06
VBS/WSH/JS - Удаление строк в REG файле gen0m.rsw Скриптовые языки администрирования Windows 7 10-10-2014 21:17
CMD/BAT - Замена нескольких строк в файле bcubbs@fb Скриптовые языки администрирования Windows 3 24-01-2013 14:01
VBS/WSH/JS - Изменение времени строк в текстовом файле на определенную величину RadioSys Скриптовые языки администрирования Windows 6 31-07-2012 20:22
[решено] Количество строк в файле 0xDEADBEEF AutoIt 3 25-01-2010 21:47




 
Переход