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

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

Ответить
Настройки темы
CMD/BAT - [решено] Создать несколько файлов из одного по условию

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


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

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


Изменения
Автор: Rey71
Дата: 25-04-2018
Вложения
Тип файла: 7z 111.7z
(473 байт, 1 просмотров)
День добрый.
Необходима помощь.
Есть текстовый файл в котором часть строк начинается с символа # и в этой же строке содержится идентификатор s**********(11 цифр после буквы S) идентификаторы могут повторяться.
Необходимо создать в этой же папке файлы с именем идентификатора и скопировать в него строки которые находятся с # и до следующей #. если такой файл уже создан то просто добавить в него строки.
пример исходного файла
# 5 НП '!!!!!!!!!!!!!!!!', ФАМИЛИЯЯ ИМЯЯЯЯЯЯ ОТЧЕСТВО, s12345678901
QQQ2 'QQQQQQQQQQQQQQQQQQ aaaaaaaaaaaaaa', aaa. 7
Не заполнено поле "aaaaaaaaaaaaaaaaaaaaaaaaa aaaaa/ aaaaaaaaaaaa" (Bed_Day)
dfhhgfhhgfhgfh gfhgfh fgh gfh fgh gfh gf h gfh gfh
# 13 НП '!!!!!!!!!!!!!!!!', ФАМИЛИЯЯ ИМЯЯЯЯЯЯ ОТЧЕСТВО, s09876543210
QQQ2 'QQQQQQQQQQQQQQQQQQ aaaaaaaaaaaaaa', aaa. 7
Не заполнено поле "aaaaaaaaaaaaaaaaaaaaaaaaa aaaaa/ aaaaaaaaaaaa" (Bed_Day)
# 98 НП '!!!!!!!!!!!!!!!!', ФАМИЛИЯЯ ИМЯЯЯЯЯЯ ОТЧЕСТВО, s11111111111
QQQ2 'QQQQQQQQQQQQQQQQQQ aaaaaaaaaaaaaa', aaa. 7
aaaaaqwfdrewgthgfjhgfjhgfjgjgf
dfhbnjhk,li;'po]0-[98ouyjgfjgfjhfhj
Не заполнено поле "aaaaaaaaaaaaaaaaaaaaaaaaa aaaaa/ aaaaaaaaaaaa" (Bed_Day)
# 143 НП '!!!!!!!!!!!!!!!!', ФАМИЛИЯЯ ИМЯЯЯЯЯЯ ОТЧЕСТВО, s12345678901
QQQ2 'QQQQQQQQQQQQQQQQQQ aaaaaaaaaaaaaa', aaa. 7
Не заполнено поле "aaaaaaaaaaaaaaaaaaaaaaaaa aaaaa/ aaaaaaaaaaaa" (Bed_Day)

Отправлено: 13:11, 25-04-2018

 

Ветеран


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

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


Цитата Rey71:
Есть текстовый файл »
Упакуйте его в архив и приложите к сообщению.

Цитата Rey71:
Необходимо создать в этой же папке файлы с именем идентификатора и скопировать в него строки которые находятся с # и до следующей #. если такой файл уже создан то просто добавить в него строки. »
В этот же архив добавьте образец результирующего файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:59, 25-04-2018 | #2



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

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


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


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

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


Вложения
Тип файла: 7z 111.7z
(473 байт, 3 просмотров)

прикрепил 1111.txt - исходный файл,
s09876543210.TXT и s12345678901.txt результирующие файлы.

Отправлено: 14:20, 25-04-2018 | #3


Ветеран


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

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


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

Отправлено: 15:30, 25-04-2018 | #4


Ветеран


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

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


Rey71, попробуйте так (на WSH):
Скрытый текст
Код: Выделить весь код
Option Explicit

Const ForAppending = 8

Dim strSourceFile
Dim arrContent
Dim objRegExp
Dim i


If WScript.Arguments.Count = 1 Then
	strSourceFile = WScript.Arguments.Item(0)

	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FileExists(strSourceFile) Then
			With .OpenTextFile(strSourceFile)
				arrContent = Split(.ReadAll(), "#")
				.Close
			End With

			Set objRegExp = WScript.CreateObject("VBScript.RegExp")
			objRegExp.Pattern = "^\s+\d+\s+ЌЏ '!!!!!!!!!!!!!!!!', .+,\s+(s\d+)$"

			For i = LBound(arrContent) + 1 To UBound(arrContent)
				If objRegExp.Test(Split(arrContent(i), vbCrLf)(0)) Then
					With .OpenTextFile(.BuildPath(.GetParentFolderName(strSourceFile), objRegExp.Execute(Split(arrContent(i), vbCrLf)(0)).Item(0).Submatches.Item(0) & ".txt"), ForAppending, True)
						.Write "#" & arrContent(i)
						.Close
					End With
				End If
			Next

			Set objRegExp = Nothing
		Else
			WScript.Echo "Can't find source file [" & strSourceFile & "]."
			WScript.Quit 2
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
	WScript.Quit 1
End If

WScript.Quit 0

Сохраните приведённый код в файл с расширением .vbs. Путь к исходному файлу указывается параметром скрипта (также можно просто перетянуть исходный файл на скрипт в Проводнике). Перед запуском убедитесь, что рядом с исходным файлом отсутствуют какие-либо ранее созданные конечные файлы, поскольку скрипт не занимается проверкой, были ли эти файлы созданы в текущем сеансе работы или ранее, а просто дописывает информацию.

Отправлено: 17:12, 25-04-2018 | #5


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


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

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


Iska, спасибо большое. Буду пробовать. По результату отпишусь.

Отправлено: 17:37, 25-04-2018 | #6


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


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

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


Iska, день добрый.
В строке вашего кода objRegExp.Pattern = "^\s+\d+\s+ЌЏ '!!!!!!!!!!!!!!!!', .+,\s+(s\d+)$"
задается шаблонная строка. Возможно ли ее исправить таким образом чтобы условие было такое: первый символ строки решетка, последнее слово строки начинается с s и 11 цифр после него, а между этими условиями любой набор текста?
Просто шаблонная строка иногда меняется (добавляются или удаляются слова и символы в середине строки)и отбор происходит неверно.

Отправлено: 07:08, 26-04-2018 | #7


Ветеран


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

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


Цитата Rey71:
первый символ строки решетка, »
Там не нужен символ «#», поскольку именно он выступает в качестве разделителя блоков текста, и исчезает при использовании оператора Split(, "#").

Цитата Rey71:
последнее слово строки начинается с s и 11 цифр после него, а между этими условиями любой набор текста? »
Примерно так:
Код: Выделить весь код
^\s+.+\s+(s\d{11})$
— в начале строки не менее одного пробела, затем произвольной длины содержимое, длиной не менее одного символа, затем ещё не менее одного пробела, затем «s» плюс точно одиннадцать цифр, затем конец строки. Устроит?
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:08, 26-04-2018 | #8


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


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

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


Iska, спасибо огромное. Буду пробовать.

Отправлено: 08:18, 26-04-2018 | #9


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


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

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


Все работает. Спасибо огромное.

Отправлено: 08:13, 28-04-2018 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Перемещение и удаление файлов по условию и маске VitHAK Скриптовые языки администрирования Windows 14 23-12-2013 08:57
CMD/BAT - [решено] Создать архив из всех файлов текущего каталога и его подкаталогов кроме одного подкат bulchonok Скриптовые языки администрирования Windows 4 04-04-2013 22:26
Любой язык - [решено] Как открыть/удалить несколько файлов одного расширения без указания имени файла 9119 Скриптовые языки администрирования Windows 1 14-12-2012 15:42
2010 - как сделать выбор параметра из таблицы данных по входному условию Pozia Microsoft Office (Word, Excel, Outlook и т.д.) 15 06-06-2011 21:49
2008 - Как в 2008 с помощью wevtutil получить записи из журнала событий по условию ? SergeyPP Windows Server 2008/2008 R2 0 24-07-2008 17:03




 
Переход