Войти

Показать полную графическую версию : Поправить bat для разделения txt по маске


william-p
21-06-2013, 21:14
http://forum.oszone.net/nextnewesttothread-187384.html
вот тут увидел очень мне подходящий вариант для разделения 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
21-06-2013, 22:19
william-p, поднять в той теме глаза выше и увидеть ещё два «подходящих» варианта кода?! Если «не подходящих» — пишите, чем именно не подходящих.

william-p
21-06-2013, 22:29
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
21-06-2013, 23:09
Есть такого формата текст: »
william-p, выложите образец реального файла. Укажите, что является маркером/маркерами. Укажите формат потребного имени файлов.

william-p
21-06-2013, 23:30
Iska,
file.txt исходный, маркеры в нем "---"

Получаются
out_1.txt
out_2.txt

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

william-p
21-06-2013, 23:44
Кстати, 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
21-06-2013, 23:54
@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
21-06-2013, 23:59
sov44, ай, спасибо, всё работает! :clapping:

Iska
22-06-2013, 00:31
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 & " <Path to source file> <Delimiter line>"
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




© OSzone.net 2001-2012