CMD/BAT - Поправить bat для разделения txt по маске

Ответить
Аватара пользователя
william-p

CMD/BAT - Поправить bat для разделения txt по маске

Сообщение william-p »

http://forum.oszone.net/nextnewesttoviewtopic.php?t=16780


вот тут увидел очень мне подходящий вариант для разделения txt по маске





Код:

Код: Выделить всё

@echo off
SETLOCAL EnableDelayedExpansion
set SRC=file.txt
set DST=out_#.txt
set DLM=--- ---
for /f "usebackq delims=" %%i In ("%SRC%") do (
if not defined $F (
  set /a $N+=1& set $F=F
  set "$O=%DST:#=!$N!%"
  type nul >"!$O!")  
if not "%%i"=="%DLM%" echo %%i>>"!$O!"
if "%%i"=="%DLM%" set $F=)

Но код удаляет пустые строки из файлов на выходе. Что дописать, чтобы пустые строки не удалялись?
Аватара пользователя
Iska

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение Iska »

william-p, поднять в той теме глаза выше и увидеть ещё два «подходящих» варианта кода?! Если «не подходящих» — пишите, чем именно не подходящих.
Аватара пользователя
Iska

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение Iska »

Iska, конечно просмотрел там всё.

Есть такого формата текст:





aaa

bbb



ccc

ddd







eee



fff





Вот это разделяет по пустым строкам, а мне нужно по маркерам



Код:

Код: Выделить всё

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set $F=file.txt
For /F "Tokens=1* Delims=[]" %%i In ('^<"%$F%" Find /V /N ""') Do (
If Not "%%j"=="" If Not Defined $F Set /A $N+=1& Set $F=F
If Not "%%j"=="" Echo.%%j>>out_!$N!.txt
If Defined $F If "%%j"=="" Set $F=)

А это по маркерам, но удаляет пустые строки, которые нужно оставить на своих местах



Код:

Код: Выделить всё

@echo off
SETLOCAL EnableDelayedExpansion
set SRC=file.txt
set DST=out_#.txt
set DLM=--- ---
for /f "usebackq delims=" %%i In ("%SRC%") do (
if not defined $F (
  set /a $N+=1& set $F=F
  set "$O=%DST:#=!$N!%"
  type nul >"!$O!")  
if not "%%i"=="%DLM%" echo %%i>>"!$O!"
if "%%i"=="%DLM%" set $F=)

А с VBS я вообще не дружу)



Поэтому и спрашиваю, как разделить txt, чтоб по маркерам и чтоб пустые строки остались на местах.
Аватара пользователя
Iska

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение Iska »

Цитата william-p:



Есть такого формата текст:
CMD/BAT - Поправить bat для разделения txt по маске




william-p, выложите образец реального файла. Укажите, что является маркером/маркерами. Укажите формат потребного имени файлов.
Аватара пользователя
william-p

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение william-p »

Iska,

file.txt исходный, маркеры в нем "---"



Получаются

out_1.txt

out_2.txt



в них пустые строки удаляются, должны сохраняться.
Аватара пользователя
william-p

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение william-p »

Кстати, VBS тоже можно, но только этот код не ищет по маркерам, только по пустой строке.





Код:

Код: Выделить всё

FileAll = "file.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.OpenTextFile(FileAll, 1)
MassAll = Split(Replace(F.ReadAll, Chr(10), ""), Chr(13))
F.Close
lf = True
nf = 0
For i = 0 To UBound(MassAll)
    If Len(Trim(MassAll(i)))  0 Then
       If lf Then
          lf = False
          nf = nf + 1
          Set F = FSO.OpenTextFile(WHere + Right("0000" + CStr(nf), 4) + ".txt", 2, True)
          F.Write MassAll(i)
       Else
          F.Write vbCrLf + MassAll(i)
       End If
    Else
       If Not lf Then F.Close
       lf = True
    End If
Next
Аватара пользователя
sov44

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение sov44 »

Код: Выделить всё

@echo off
SETLOCAL EnableDelayedExpansion
set SRC=file.txt
set DST=out_#.txt
set DLM=--- ---
for /f "tokens=1* delims=]" %%a in ('find /v /n "" ^<"%SRC%"') do (
if not defined $F (
  set /a $N+=1& set $F=F
  set "$O=%DST:#=!$N!%"
  type nul >"!$O!")  
if not "%%b"=="%DLM%" (echo.%%b>>"!$O!")
if "%%b"=="%DLM%" set $F=)
Аватара пользователя
william-p

Re: CMD/BAT - Поправить bat для разделения txt по маске

Сообщение william-p »

william-p, держите:


читать дальше »




Код:

Код: Выделить всё

Option Explicit
Dim strSourceFile
Dim strDestFile
Dim strPattern
Dim arrContent
Dim lngCounter
If WScript.Arguments.Count = 2 Then
	strSourceFile = WScript.Arguments.Item(0)
	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FileExists(strSourceFile) Then
			strPattern = WScript.Arguments.Item(1)
			WScript.Echo "Source file:   " & strSourceFile
			WScript.Echo "Pattern line:  " & strPattern
			WScript.Echo "Output folder: " & .GetAbsolutePathName("")
			WScript.Echo "=================================================="
			With .OpenTextFile(strSourceFile)
				arrContent = Split(.ReadAll(), strPattern & vbCrLf)
				.Close
			End With
			For lngCounter = LBound(arrContent) To UBound(arrContent)
				strDestFile = .GetAbsolutePathName("out_" & lngCounter & ".txt")
				With .CreateTextFile(strDestFile, True)
					.Write arrContent(lngCounter)
					.Close
				End With
				WScript.Echo strDestFile
			Next
		Else
			WScript.Echo "Source file [" & strSourceFile & "] not found"
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & "  "
End If
WScript.Quit 0





Пример исполнения скрипта:


читать дальше »




Код:

Код: Выделить всё

E:\Песочница\0282>0001.vbs file.txt "---"
Source file:   file.txt
Pattern line:  ---
Output folder: E:\Песочница\0282
==================================================
E:\Песочница\0282\out_0.txt
E:\Песочница\0282\out_1.txt
E:\Песочница\0282\out_2.txt
Ответить

Вернуться в «Скриптовые языки администрирования Windows»