Войти

Показать полную графическую версию : Копирование первой строки из файла


Страниц : [1] 2

MultiMax
17-05-2011, 11:48
Помогите пожалуйста! Есть файл broad.int из него нужно скопировать в файл 1. txt первую строку. Но начать копирование только после 14ого символа в первой строке... То есть в конечном файле должно быть только "Градусы - Кто ты"

17051110425000Градусы - Кто ты

Значения первых 14ти символов постоянно меняются.. их нужно игнорировать.. реально ли реализовать это с помощью бат скрипта? Заранее спасибо!

El Sanchez
17-05-2011, 12:48
MultiMax,

@Echo Off
For /F "Tokens=*" %%A In (broad.int) Do Call :_Func "%%A"
Exit /B 0

:_Func
Set "Str=%~1"
If "%Str:~14%"=="" Exit /B
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>1.txt

Foreigner
17-05-2011, 17:28
MultiMax,

@echo off
1>nul chcp 1251
setlocal

0<broad.int set /p "string="
1>1.txt echo %string:~14%

MultiMax
17-05-2011, 19:11
Спасибо! Вот только строчка длинная.. ограничить бы как-нибудь ее.. если вправо пролистать, то там пусть к файлу еще... Этот файлик нужен для вывода на радиостанции названия песни :) Вот что пишет по поводу файла разработчик:

"Во время проигрывания плей-листа в папке, где находится плей-лист, создается файл broad.int. В этом файле находится информация о проигрываемом объекте и 9-ти следующих за ним объектах.

Формат одной строчки файла:

время выхода[12]битовая маска атрибутов[2]текстовая информация[255]полный путь к файлу[255]длительность звучания[8]резервное поле2[247]0x0a

0x0a - символ конца строки
'x' - символ конца файла"

1) Можно ли как-нибудь ограничить количество символов, чтобы копировалось только название песни? В скрипте El Sanchez, удаляются кстати все символы лишние... но на второй и остальных строчках, в первой - нет :)
2) Возможно это сложно, но был бы оочень и премного благодарен и признателен, если кто-нибудь помог с тем, чтобы скрипт копировал название песни, только если она находится в каталоге E:\Music, если нет, то не обрабатывать, выдавать пустой ткст файл например.

El Sanchez
17-05-2011, 20:39
удаляются кстати все символы лишние »
MultiMax, ведь вы в шапке это и сказали
должно быть только "Градусы - Кто ты" »
но на второй и остальных строчках, в первой - нет »
MultiMax, неправда. Вот, что у меня на выходе:

Hurts - Wonderful Life
Градусы - Кто ты
Gwen, Stefani - The Sweet Escape
Simply Red - Fake
Sean, Jay - Tonight
Future Of Vision - Here Comes The Rain Again
Adriana & Vivien O’Hara - Too Late To Cry
Rickitt, Adam - Everything My Heart Desires
DJ Smash - Moscow Never Sleeps
3OH!3 feat. Kesha - My First Kiss

чтобы скрипт копировал название песни, только если она находится в каталоге E:\Music, »
MultiMax, вторую строку заменить на:
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"

MultiMax
17-05-2011, 22:50
El Sanchez, да, действительно. Спасибо! Скрипт запускается раз в минуту и... в файле 1.txt накапливается информация... можно сделать так чтобы при "обновлении" все подчищалось, как в скрипте Foreigner? И если можно чтобы выводился не целый список, а только первая песенка, остальное пока что не нужно. Но спасибо вам огромное!!!

El Sanchez
18-05-2011, 10:31
MultiMax,

@Echo Off
Set Cnt=0
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"
Exit /B 0

:_Func
Set "Str=%~1"
If "%Str:~14%"=="" Exit /B
If %Cnt% EQU 1 Exit /B
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A
Set /A Cnt+=1

MultiMax
18-05-2011, 17:41
El Sanchez, спасибо! Дописал куда будет сохранять только


@Echo Off
Set Cnt=0
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"
Exit /B 0

:_Func
Set "Str=%~1"
If "%Str:~14%"=="" Exit /B
If %Cnt% EQU 1 Exit /B
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>1.txt
Set /A Cnt+=1

Файлик 1.txt не подчищается с каждым запуском скрипта... Накапливается по строчке все больше и больше

MultiMax
18-05-2011, 17:57
Сделал вот так...

@Echo Off

del F:\Broad\1.txt
end

Set Cnt=0
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"
Exit /B 0

:_Func
Set "Str=%~1"
If "%Str:~14%"=="" Exit /B
If %Cnt% EQU 1 Exit /B
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>1.txt
Set /A Cnt+=1

Но если песня из каталога НЕ music, скрипт показывает файл следующий по списку который из папки... а в эфире-то он не играет пока что :) Можно ли сделать так, чтобы в случае, если песня не из каталога music, выдавался пустой файл? И самая последняя просьба: помогите пожалуйста сделать так, чтобы весь скрипт выполнялся по кругу каждые 20 секунд, не закрывая своего окошка (Windows Scheduler каждый раз запуская скрипт открывает окно, и оно постоянно всплывает)

MultiMax
18-05-2011, 19:17
Проблема с запуском каждые 20 сек отпала! Помогите пожалуйста сделать, чтобы в случае, если песня не из каталога music, выдавался пустой файл

Foreigner
18-05-2011, 19:20
MultiMax,
Попробуйте такой вариант

@echo off
setlocal
1>nul chcp 1251

0<broad.int set /p "string="

echo %string% | 1>nul 2>&1 findstr "E:\\Music" || cd.>1.txt && goto:eof

call:set %string:~14,255%

1>1.txt echo %song%
goto:eof

:set
set "song=%*"

El Sanchez
18-05-2011, 21:40
Foreigner, супер! Изящное решение, ничего не скажешь.
MultiMax, добил свой вариант. Если ping не нужен удалить/закомментировать выделенное:

@Echo Off
0<broad.int Set /P "Str="
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1* Delims=$" %%A In ("%Str%") Do Echo %%B|Find /i "E:\Music" 1>nul 2>&1&&Echo.%%A>1.txt||cd.>1.txt
ping 127.0.0.1 -n 20 1>nul 2>&1&&call %0

MultiMax
19-05-2011, 00:11
Foreigner, El Sanchez СПАСИБО ВАМ ОГРОМНОЕ!!! Даже не знаю, как благодарить :) Все работает, версия с пингом вообще шикарна, все гениальное - просто, ведь недаром говорят) Извините за то что возможно отнял время! Еще раз СПА-СИ-БО!

MultiMax
19-05-2014, 22:25
снова здравствуйте! есть проблема с этим скриптом - при наличии в названии песни символа "&", скрипт не выполняется. Как поправить?

MultiMax
20-05-2014, 09:43
Помогите советом пожалуйста! Есть специальный плеер, который выплевывает файл с названием текущего трека + последующих в плейлисте. Есть скрипт bat, который парсит этот файл и выплевывает текстовый с одной строчкой - Имя Артиста - Название песни. При наличии в названии песни значка &, скрипт не выполняется. Как это обойти?

Вот сам скрипт:

@echo off


setlocal
1>nul chcp 1251

0<broad.int set /p "string="

echo %string% | 1>nul 2>&1 findstr "B" || cd.>onair.txt && goto:eof

call:set %string:~14,255%

CHCP 65001|1>onair.txt echo %song%&utf-8
goto:eof

:set
set "song=%*"


Файл, который надо парсить, приложил

MultiMax
21-05-2014, 21:22
есть кто?

MultiMax
26-05-2014, 10:18
работает, только после названия песни выплевывает в текстовый файл путь и имя файла. обрубить бы это как-нибудь и оставить только Артист - Название песни... прикрепил...

kdolzhanskiy@vk
14-07-2014, 11:30
Помогите пожалуйста с кодом. Есть логика, а навыков нет ;) Нужно из файлика Nowplay (в файле только одна строка - Исполнитель и название песни) вытаскивать в другой файл первые 8 символов плюс "2", делать перенос и повторять операцию, но уже со сдвигом на символ и так до конца строки. Результаты работы в новый файл. Это для работы RDS-кодера на радио.

То есть:

Доктор Дре - Она одна такая
Доктор Д 2
октор Др 2
ктор Дре 2
тор Дре 2
ор Дре - 2
р Дре - 2
Дре - О 2
Дре - Он 2
ре - Она 2
е - Она 2
- Она О 2
- Она Од 2 .... и.т.д.

Код однократного действия я нашел... а дальше швах!

@echo off
for /f "usebackq delims=" %%i in ("nawplay.txt") do set "first_string=%%i"& goto:#
:#
set "first_string=%first_string:~0,8% 2"
for /f "delims=^" %%i in ("%first_string: =^%") do echo %%i>"1.txt"
exit /b


В идеале еще сделать в том же файле транслитерацию... но это уже будет просто опупенно

for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i"
"J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r"
"S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=a"
"Б=b" "В=v" "Г=g" "Д=d" "Е=e" "Ж=zh" "З=z" "И=i" "К=k"
"Л=l" "М=m" "Н=n" "О=o" "П=p" "Р=r" "С=s" "Т=t" "У=u"
"Ф=f" "Х=x" "Ц=c" "Ч=4" "Ш=sh" "Щ=ch" "Ь='" "Ы=i" "Ъ='"
"Э=e" "Ю=ju" "Я=ja") do (
call set %~1=%%%~1:%%~a%%

kdolzhanskiy@vk
23-07-2014, 13:33
Помогите пожалуйста с кодом. Есть логика, а навыков нет Нужно из файлика Nowplay (в файле только одна строка - Исполнитель и название песни) вытаскивать в другой файл первые 8 символов плюс "2", делать перенос и повторять операцию, но уже со сдвигом на символ и так до конца строки. Результаты работы в новый файл. Это для работы RDS-кодера на радио.

То есть:

Доктор Дре - Она одна такая
Доктор Д 2
октор Др 2
ктор Дре 2
тор Дре 2
ор Дре - 2
р Дре - 2
Дре - О 2
Дре - Он 2
ре - Она 2
е - Она 2
- Она О 2
- Она Од 2 .... и.т.д.

Код однократного действия я нашел... а дальше швах!

Задачу почти получилось решить выполнением кучи отдельных батников. Так 14 батников отвечают за распиливание строки на 14 кусков со сдвигом на символ и добавлением " 2". Правда чуть пришлось переделать хвостик ;) Получается 1.txt, 2.txt и т.д. до 14.txt

echo off
for /f "usebackq delims=" %%i in ("OnAir.txt") do set "first_string=%%i"& goto:#
:#

set "first_string=%first_string:~0,8%"
for /f "delims=^" %%i in ("%first_string: =^%") do <nul set /p $WRT="%%i 2" >1.txt

exit /b


Затем 15 батник собирает из получившихся текстовиков один со строчками


@echo off
(
type 1.txt
echo:
type 2.txt
echo:
type 3.txt
echo:
type 4.txt
echo:
type 5.txt
echo:
type 6.txt
echo:
type 7.txt
echo:
type 8.txt
echo:
type 9.txt
echo:
type 10.txt
echo:
type 11.txt
echo:
type 12.txt
echo:
type 13.txt
echo:
type 14.txt
)>C:\Default.txr


Все батники по очереди вызываются из одного call-ом.
Не смотря на мусорность конструкция работает. Все бы хорошо, но возникла проблема - если количества символов не хватает на создание 14 текстовиков - слить их не получается. Можно как то решить проблему со слиянием, если число файлов для него произвольное, но располагаться все должно столбиком?

Iska
23-07-2014, 14:32
На WSH:
Option Explicit

Dim strSourceFile
Dim strDestFile

Dim strLine

Dim i


strSourceFile = "C:\Песочница\047\NowPlay.txt"
strDestFile = "C:\Песочница\047\NowPlay2.txt"

With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
strLine = .ReadLine()
.Close
End With

With .CreateTextFile(strDestFile, True)
For i = 1 To Len(strLine) - 8 + 1
.WriteLine Mid(strLine, i, 8) & " 2"
Next

.Close
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 1
End If
End With

WScript.Quit 0

По поводу транслитерации — Ваш набор неполон. Где «ё», где «й»?




© OSzone.net 2001-2012