Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создать несколько файлов из одного по условию (http://forum.oszone.net/showthread.php?t=334501)

Rey71 25-04-2018 13:11 2810624

Создать несколько файлов из одного по условию
 
Вложений: 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)

Iska 25-04-2018 13:59 2810640

Цитата:

Цитата Rey71
Есть текстовый файл »

Упакуйте его в архив и приложите к сообщению.

Цитата:

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

В этот же архив добавьте образец результирующего файла.

Rey71 25-04-2018 14:20 2810650

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

Iska 25-04-2018 15:30 2810677

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

Iska 25-04-2018 17:12 2810716

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. Путь к исходному файлу указывается параметром скрипта (также можно просто перетянуть исходный файл на скрипт в Проводнике). Перед запуском убедитесь, что рядом с исходным файлом отсутствуют какие-либо ранее созданные конечные файлы, поскольку скрипт не занимается проверкой, были ли эти файлы созданы в текущем сеансе работы или ранее, а просто дописывает информацию.

Rey71 25-04-2018 17:37 2810721

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

Rey71 26-04-2018 07:08 2810803

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

Iska 26-04-2018 08:08 2810810

Цитата:

Цитата Rey71
первый символ строки решетка, »

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

Цитата:

Цитата Rey71
последнее слово строки начинается с s и 11 цифр после него, а между этими условиями любой набор текста? »

Примерно так:
Код:

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

Rey71 26-04-2018 08:18 2810815

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

Rey71 28-04-2018 08:13 2811124

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


Время: 00:27.

Время: 00:27.
© OSzone.net 2001-