Как удалить перенос строки по условию в bat файле
Коллеги, приветствую! Есть текстовый файл со строками вида:
00:00.741004-1,DBMSSQL,5,p:processName=QQQ,t:computerName=SRV,t:connectID=144493,Usr=Расписание,dbpid=66,Sql='INSERT INTO dbo._InfoRg43436 (_Fld43437RRef,_Fld43438,_Fld43439) VALUES(?,?,?)',Context='
МодульСеанса : 7 : ПолныеПрава.УстановитьПараметрыМеханизмаОграниченияПравДоступа();
ОбщийМодуль.ПолныеПрава.Модуль : 710 : Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь());
ОбщийМодуль.Пользователи.Модуль : 15 : Возврат ПользователиКлиентСервер.АвторизованныйПользователь();
ОбщийМодуль.ПользователиКлиентСервер.Модуль : 22 : Возврат ПараметрыСеанса.ТекущийПользователь;
00:01.148006-1,DBMSSQL,5,p:processName=QQQ,t:computerName=SR,t:connectID=144494,Usr=Расписание189,dbpid=66,Sql='DELETE FROM T1
FROM dbo._InfoRg43436 T1
WHERE T1._Fld43437RRef = ? AND T1._Fld43438 = ? AND T1._Fld43439 = ?
p_0: 0xA9A4F8F21E2B439D11EAA92A9F1C4FDE
p_1: 5673N
p_2: 40200608130000
',Context='
МодульСеанса : 7 : ПолныеПрава.УстановитьПараметрыМеханизмаОграниченияПравДоступа();'
Необходимо сделать так, что если строка начинается по шаблону рег. выражения \d\d:\d\d.\d+- то строки стоящие после нее и не подходящие под этот шаблон должны переносится на эту строку с определенным разделителем, например таким "|". Или если перефразировать, если строка не подходит под регулярку, то перенести ее на предыдущую строку поставив перед ней символ "|". В моем примере должно получиться следующее:
00:00.741004-1,DBMSSQL,5,p:processName=QQQ,t:computerName=SRV,t:connectID=144493,Usr=Расписание,dbpid=66,Sql='INSERT INTO dbo._InfoRg43436 (_Fld43437RRef,_Fld43438,_Fld43439) VALUES(?,?,?)',Context='|МодульСеанса : 7 : ПолныеПрава.УстановитьПараметрыМеханизмаОграниченияПравДоступа();| ОбщийМодуль.ПолныеПрава.Модуль : 710 : Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь());| ОбщийМодуль.Пользователи.Модуль : 15 : Возврат ПользователиКлиентСервер.АвторизованныйПользователь();| ОбщийМодуль.ПользователиКлиентСервер.Модуль : 22 : Возврат ПараметрыСеанса.ТекущийПользователь;'
00:01.148006-1,DBMSSQL,5,p:processName=QQQ,t:computerName=SR,t:connectID=144494,Usr=Расписание189,dbpid=66,Sql='DELETE FROM T1|FROM dbo._InfoRg43436 T1|WHERE T1._Fld43437RRef = ? AND T1._Fld43438 = ? AND T1._Fld43439 = ?|p_0: 0xA9A4F8F21E2B439D11EAA92A9F1C4FDE|p_1: 5673N|p_2: 40200608130000|',Context='|МодульСеанса : 7 : ПолныеПрава.УстановитьПараметрыМеханизмаОграниченияПравДоступа();'
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
[ join.vbs ]
Const ForReading = 1, ForWriting = 2
Const SourceFileName = "c:\tmp\src.txt"
Const DestinationFileName = "c:\tmp\dst.txt"
Const Pattern = "\|(\d\d:\d\d.\d+-)"
Const Replacement = vbNewLine & "$1"
Set fso = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp
Set SRCfile = fso.OpenTextFile(SourceFileName, ForReading)
Set DSTfile = fso.OpenTextFile(DestinationFileName, ForWriting, True)
regEx.Pattern = Pattern
DSTfile.Write regEx.Replace(Replace(SRCfile.ReadAll, vbNewLine, "|"), Replacement)
SRCfile.Close
DSTfile.Close
Автор решения: andreynikus
→ Ссылка
В итоге навоял следующее
Const SourceFileName = "c:\1\1\20060813.log"
Const DestinationFileName = "c:\1\1\20060813_4.log"
Const Pattern = "^\d\d:\d\d.\d"
Set regEx = New RegExp
regEx.Pattern = Pattern
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.Type = 2
objStream.Open
objStream.LoadFromFile SourceFileName
Set objStream2 = CreateObject("ADODB.Stream")
objStream2.Charset = "utf-8"
objStream2.Type = 2
objStream2.Open
str0 = ""
Do Until objStream.EOS
str1 = objStream.ReadText(-2)
if regEx.Test(str1) then
objStream2.WriteText str0, 1
str0 = str1
else
str0 = str0 & "|" & str1
end if
Loop
if str0 <> str1 then objStream2.WriteText str0, 1
objStream2.SaveToFile DestinationFileName
objStream.Close
objStream2.Close