PDA

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


shadowbat
20-05-2010, 22:53
имеется файл txt такого типа

вфывафыа
фывфыв
фывфыв



фывфывфыв
аываываыва
ываываыва


и так штук 300 кусков.

как разбить это все на 300 файлов txt, чтобы каждый из них начинался со своего куска

(как вариант можно к каждому куску добавить любой символ. например !!! чтобы батник или vbs находил следующий кусок по маске "!!!" - это как вариант)

amel27
21-05-2010, 09:31
@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=)

shadowbat
21-05-2010, 09:41
amel27, работает!!

Вы гений!! хорошо, когда в каждой среде есть специалисты :) (см. PM)

megaloman
21-05-2010, 20:59
Ответы amel27, конечно, учебник по bat- файлам! Моё решение в VBS сделано прямолинейно, но выбрасывать жалко, вставляю свои 5 коп. WHere = "H:\Delete\" ' Папка где файлы
FileAll = WHere + "all.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

shadowbat
21-05-2010, 23:03
но выбрасывать жалко »
интересно было бы создать большую библиотеку с 300-400 задач и конкретными решениями. вот например на основе этого форума. получится хорошая книжка/ FAQ

так самое главное, что мне нравится - ничего качать не нужно. создал BAT и программа готова :)

Seryoga204
04-10-2010, 22:47
А если файл такого типа:

вапвпывпывпв
ывпывапывпыв
вапывпывпывп
--- ---
ывпывпывпывпыв
впывпывпывпыв
вапывпывпывп
ывапывпывпвып
--- ---
ывпаывапывпывп
ывапывпывпывпыв
вапывпывпывапывп
--- ---

Т.е. блоки разделены не пустой строкой, а строкой типа
"--- ---"

amel27
05-10-2010, 04:06
Seryoga204, если пустые строки не важны, можно так:
@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=)

P.S. два разделителя подряд дают пустой файл

Seryoga204
05-10-2010, 07:10
amel27,
Спасибо! То что надо.




© OSzone.net 2001-2012