Показать полную графическую версию : [решено] разбить по строкам txt
…можно сделать в одном bat файле или надо для каждого имени такой bat создавать? »
Вы раз от разу задаёте похожий вопрос. Ответ такой: код выносится в процедуру («:метка» … «exit /b»|«goto :eof»), которая вызывается потребное число раз с передачей ей параметров.
Alexander_88
19-08-2014, 10:14
Спасибо большое, еще и со звукок :clapping:
Alexander_88
27-08-2014, 03:11
а такой код нельзя заставить работать если txt сохранен в формате unicode text file ?
просто программа по умолчанию сохраняет в формате "unicode text file", приходится каждый раз менять тип на "text file" или как - тоизбавится от этого сохранения в unicode text file, чтобы по умолчанию, сразу предлагалось в text file))
Alexander_88, нижеприведённое "достижение науки" с "UTF-8" справляется. Но даже если этот код не подойдёт для обработки Ваших "юникодных" файлов, то используйте его для обработки других файлов, т. к. результаты его работы корректнее результатов работы предыдущего кода.
@echo off
chcp 1251>nul
set string_quantity=50
set index_format=4
:: Set the value of the variable: «+» or nothing.
set final_blank_line=+
:: Enter the names of one or more files.
for %%? in (
"list1.txt"
"list2.txt"
"list3.txt"
) do (
call:sub %%?
)
del .txt .vbs
exit /b
:sub
setlocal
(
echo.
echo $$$
for /f "delims=" %%i in ('
find /n /v ""^<%1
') do (
set string=%%i
(
for /f "delims=" %%j in ('
call set /p"=%%string:*]=%%"^<nul
') do (
echo %%j
)
)|| (
echo.
)
set /a count_1+=1
for /f %%j in ('
set /a count_1
') do (
if %%j==1 (
set /a count_2+=1
)
if %%j==%string_quantity% (
echo $$$
set count_1=
)
)
)
echo $$$
)>.txt
for /f %%i in ('
set /a index_format-1
') do (
for /l %%j in (1 1 %%i) do (
call set zeros=0%%zeros%%
)
)
for /l %%i in (1 1 %count_2%) do (
set $index=%zeros%%%i
for /f %%j in ('
call echo %%$index:~-%index_format%%%
') do (
set /p="WScript.StdOut.Write(Split(WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(".txt").ReadAll(), vbCrLf&"$$$"&vbCrLf)(%%i))"<nul>.vbs
(
cscript //nologo .vbs
if "%final_blank_line%"=="+" (
echo.
)
)>"%~dpns1%%j%~xs1"
)
)
set /p="WScript.CreateObject("SAPI.SpVoice").Speak("Processing of the '%~nxs1' file is complete!")"<nul>.vbs
cscript //nologo .vbs 2>nul
endlocal
exit /b
Alexander_88
27-08-2014, 12:59
Georgio понял, спасибо вам за помощь
Alexander_88
27-08-2014, 13:17
Georgio, а имена выводимых файлов не должны меняться? почему то они у меня не много не такие получаются.
если файл называется Alexander, получаются файлы ALEXAN~101, ALEXAN~102, ALEXAN~103 ................ чисел в нумерации установлено 2
Alexander_88, попробуйте:
@echo off
chcp 1251>nul
set string_quantity=50
set index_format=4
:: Set the value of the variable: «+» or nothing.
set final_blank_line=+
:: Enter the names of one or more files.
for %%? in (
"list1.txt"
"list2.txt"
"list3.txt"
) do (
call:sub %%?
)
del .txt .vbs
exit /b
:sub
setlocal
(
echo.
echo $$$
for /f "delims=" %%i in ('
find /n /v ""^<%1
') do (
set string=%%i
(
for /f "delims=" %%j in ('
call set /p"=%%string:*]=%%"^<nul
') do (
echo %%j
)
)|| (
echo.
)
set /a count_1+=1
for /f %%j in ('
set /a count_1
') do (
if %%j==1 (
set /a count_2+=1
)
if %%j==%string_quantity% (
echo $$$
set count_1=
)
)
)
echo $$$
)>.txt
for /f %%i in ('
set /a index_format-1
') do (
for /l %%j in (1 1 %%i) do (
call set zeros=0%%zeros%%
)
)
for /l %%i in (1 1 %count_2%) do (
set $index=%zeros%%%i
for /f %%j in ('
call echo %%$index:~-%index_format%%%
') do (
set /p="WScript.StdOut.Write(Split(WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(".txt").ReadAll(), vbCrLf&"$$$"&vbCrLf)(%%i))"<nul>.vbs
(
cscript //nologo .vbs
if "%final_blank_line%"=="+" (
echo.
)
)>"%~dpn1%%j%~x1"
)
)
set /p="WScript.CreateObject("SAPI.SpVoice").Speak("Processing of the '%~nx1' file is complete!")"<nul>.vbs
cscript //nologo .vbs 2>nul
endlocal
exit /b
.
Alexander_88
27-08-2014, 13:53
Работает, спасибо :yahoo:
blackeangel
06-11-2015, 20:15
Всем привет. Есть такая проблема.Необходимо разбить файл на 3 части. Причем кол-во строк в каждой части разное.
Разбивать так: 1 файл от начала и до строки которая задается переменной; 2ой файл между 2мя переменными(так как переменные получаются по найденым словам в тексте и их номера строк),3й файл - от второй переменной и до конца файла.
Желательно через CMD сия мероприятие производить...
знаю что найти сномер строки вот так вот
for /f "delims=[] tokens=1*" %%a in ('find /i /n "text" ^< "start.txt"') do echo number=%%a »
@echo off
set "file=example.txt"
set "marker_1=слово (или фраза), по которому нужно определить первую строку"
set "marker_2=слово (или фраза), по которому нужно определить вторую строку"
for /f "delims=:" %%i in ('
2^>nul (findstr/iln /c:"%marker_1%" /c:"%marker_2%" "%file%"^& ^<"%file%" find/c /v ""^)
') do (
if not defined x (set x=%%i) else (if not defined y (set y=%%i) else (set z=%%i))
)
for %%i in ("%file%") do <%%i (
for %%? in (1 2 3) do 2>nul del "%%~ni_%%?%%~xi"
for /l %%j in (1 1 %z%) do (
if %%j leq %x% (set n=1) else (if %%j lss %y% (set n=2) else (set n=3))
for /f %%k in ('set/a n') do (
set x=& set/p x=& >>"%%~ni_%%k%%~xi" (
if defined x (cmd/v/c echo.!x!) else (echo.)
)
)
)
)
exit/b
blackeangel
07-11-2015, 09:59
Georgio, спасибо огромное )))
blackeangel
07-11-2015, 18:07
Georgio, а скажите есть в бат какая нибудь команда типа for из c# ?
Foreigner
07-11-2015, 18:28
blackeangel, если имеется ввиду инкрементация:
for /l %%i in (0,1,9) do echo %%i
blackeangel
07-11-2015, 19:09
Georgio, ваш код по разбитию не работает правильно...он выдает 3 файла:
1- как оригинал,2 и 3 пустые.
Я привел его к такому вот виду
@echo off
set "file=init.rc"
set "marker_1=#Camera"
set "marker_2=#/dev/RT_Monitor"
for /f "delims=:" %%i in ('
2^>nul (findstr/iln /c:"%marker_1%" /c:"%marker_2%" "%file%"^& ^<"%file%" find/c /v ""^)
') do (
if not defined x (set x=%%i) else (if not defined y (set y=%%i) else (set z=%%i))
)
for %%i in ("%file%") do <%%i (
for %%? in (1 2 3) do 2>nul del "%%~ni_%%?%%~xi"
for /l %%j in (1 1 %z%) do (
if %%j leq %x% (set n=1) else (if %%j lss %y% (set n=2) else (set n=3))
for /f %%k in ('set/a n') do (
set x=& set/p x=& >>"%%~ni_%%k%%~xi" (
if defined x (cmd/v/c echo.!x!) else (echo.)
)
)
)
)
exit/b
прилагаю то что получил на выходе+оригинал
blackeangel
07-11-2015, 19:16
Foreigner, нет,что то типа
::находим строки начала и конца
for /f "delims=[] tokens=1*" %%b in ('find /i /n "#Camera" ^< "init.rc"') do
for /f "delims=[] tokens=1*" %%c in ('find /i /n "#/dev/RT_Monitor" ^< "init.rc"') do
::содержимое между ними кидаем в новый файл
for /l %%a=%%b in (%%b,1,%%c) do echo %%a>>1.txt
но оно не работает
Foreigner
07-11-2015, 19:29
но оно не работает »
А должно? Нет такого, как в сишарп. Юзайте powershell, тем более если знакомы с C#. Поясните ваш пример, иначе он бессмысленный.
нет,что то типа »
for /l %%a in (%b%,1,%c%) do echo %%a>>1.txt
Но это просто выведет последовательность чисел от «%b%» до «%с%» с шагом «1» в файл «1.txt», а вовсе не то, что Вы явно планировали получить.
Давайте начнём с простого и понятного: упакуйте образец исходного файла в архив, выложите архив на RGhost. Опишите потребную задачу полностью — без учёта:
(так как переменные получаются по найденым словам в тексте и их номера строк) »
а с самого начала.
blackeangel
07-11-2015, 19:43
Iska, задача проста-заменить абзац текста из одного файла в другом по 2м меткам которые уже писались парой постов выше в коде.То есть они этих файлах присутствуют.Файл я прикладывал там же где и код(большой который).Реализовать это на батнике нереально, поэтому решил обойти это в 4 шага.
1.Из первого файла диапазон между метками отправить в новый файл
2.Второй файл разбить на 3 части ( по условию что писалось на предыдущей стр)
3. Заменить одну часть на файл из п.1
4. Соединить всё в новый файл который нужен
Самое сложное оказались первые 2 пункта..
Foreigner
07-11-2015, 20:12
нет,что то типа »
sed -n "/#Camera/,/#\/dev\/RT_Monitor/ p" init.rc | sed -r "/^.+#.+$/ d" > другой_файл
blackeangel
07-11-2015, 20:36
Foreigner, sed это программа, так понимаю, для поиска и замены текста?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.