Войти

Показать полную графическую версию : [решено] Создать несколько файлов из одного по условию


Rey71
25-04-2018, 13:11
День добрый.
Необходима помощь.
Есть текстовый файл в котором часть строк начинается с символа # и в этой же строке содержится идентификатор 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
Есть текстовый файл »
Упакуйте его в архив и приложите к сообщению.

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

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

Iska
25-04-2018, 15:30
Rey71, примерно понятно. Нужно разбить содержимое исходного файла на части и сгруппировать части по идентификатору. Будем смотреть.

Iska
25-04-2018, 17:12
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
Iska, спасибо большое. Буду пробовать. По результату отпишусь.

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

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

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

Rey71
26-04-2018, 08:18
Iska, спасибо огромное. Буду пробовать.

Rey71
28-04-2018, 08:13
Все работает. Спасибо огромное.




© OSzone.net 2001-2012