Показать полную графическую версию : [решено] Как "красиво" распознать Строчные/Прописные буквы?
Ради интереса веду "лог" затрат на свое "корыто".
Формат таков:
сумма[TAB]дата[TAB]сабж
при этом если поле сабж начинается с маленькой буквы, то это "работы", а с большой - "запчасти".
сегодня задумался, сколькож я потратил и быстренько накатал батничек для подсчета общей суммы. Но поскольку в самом логе уже заложено разделение работ и запчастей, захотелось "добавить" разделение общей суммы на составляющие, но как оказалось отличить строчные/прописные буквы весьма проблематично. Во всяком случае сделать это "красиво", не увеличивая существенно время выполнения батника так и не удалось.
Никто не сталкивался с подобными задачами? Может поделитесь опытом?
El Sanchez
15-06-2010, 21:15
сумма[TAB]дата[TAB]сабж »
NiOl, я так понимаю 3 токен пропарсить. Тогда в качестве примера:
@Echo Off
Set Symbols=ABCDEFGHIJKLMNOPQRSTUVWXYZ
For /F "Tokens=2*" %%A In (zatraty.log) Do Echo %%B|FindStr \^<[%Symbols%] 1>nul&&Echo Сабж %%B начинается с большой буквы||Echo Сабж %%B начинается с маленькой буквы
ну да, при всём богатстве выбора... из штатных кроме FindStr никакой альтернативы:
@Echo Off
Set LCase=abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя
Set HCase=ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
For /F %%a In ('findstr /ERC:" [%LCase%][^ ]*" 1.txt') Do Set /A LSum+=%%a
For /F %%a In ('findstr /ERC:" [%HCase%][^ ]*" 1.txt') Do Set /A HSum+=%%a
Echo Затраты на работы : %LSum%
Echo Затраты на запчасти: %HSum%
pause>nul
P.S. убила реализация интервала в классе FindStr: "[a-c]" соответствует "[aAbBc]"... :shot:
Всем спасибо!
Вот у меня тоже пришлось findstr задействовать, но в отличае от варианта, предложенного amel27, вышло не 2 прохода, а аж целых 3.
Все уже, получил нужные циферки, но сама идея различить строчные/прописные буквы только средствами CMD покоя не давала...
Таки соорудил свой батничек без внешних вызовов FindStr...
Идея в том, что для set при замене подстроки не важно, какой символ искать, и подменив в строке мелких букв искомую, получаем туже самую строку, если искомая буква строчная, иначе буква прописная.
@Echo off
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set C=0
set S=0
set W=0
set Chars=abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя
for /f "usebackq tokens=2,3 delims= " %%P in ("%~dpn0.txt") do if not %%P_==_ if not %%Q_==_ call :Calc %%P "%%Q"
set /a T=%S%+%W%
set S= %S%
set S=%S:~-11%
set W= %W%
set W=%W:~-11%
set T= %T%
set T=%T:~-11%
Echo Spares: %S%
Echo Service:%W%
Echo ===================
Echo Total: %T%
exit
:Calc
set ch=%~2
set ch=%ch:~0,1%
set b=!Chars:%ch%=%ch%!
for /f "tokens=1 delims=.," %%C in ("%1") do set /a C=%%C
if %Chars%==%b% (set /a W+=C) else (set /a S+=C)
exit /b
зы: Заметил пару неприятных моментов:
1. Неинициализированные в основном теле переменные (в моем случае S и W) работают как локальные, т.е. их значения не сохраняются.
2. Поскольку если используешь "SetLocal EnableDelayedExpansion" - жди случайных искажений имен файлов и некоторых данных, а наличие записи set b=!Chars:%ch%=%ch%! требует включения этого режима, то попробовал включать режим непосредственно перед указанной строкой, а следом отключать - при этом в итогах также получал одни нули.
usebackq tokens=2,3 »гм... так всё-таки сначала дата, потом сумма?.. ;)
для set при замене подстроки не важно, какой символ искать »интересно, не думал что и для русских так же... учитывая половинчатую локализацию CMD
по ходу M$ забыли для SET ключик /I аналогично IF :)
Неинициализированные в основном теле переменные (в моем случае S и W) работают как локальные »не заметил... возможно, это связано с переносами SetLocal - она ограничивает область видимости
наличие записи set b=!Chars:%ch%=%ch%! требует включения этого режима »можно обойти через CALL:@Echo Off
Set Chars=abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя
For /F "Usebackq Tokens=2* Delims= " %%P in ("%~n0.txt") Do If Not %%P_==_ If Not %%Q_==_ Set "C=%%P"& Set "ch=%%Q"& Call :CALC
GoTo :NEXT
:CALC
Set "C=%C: =%"
Set "C=%C:.=&REM.%"
Set "C=%C:,=&REM.%"
Call Set "b=%%Chars:%ch:~0,1%=%ch:~0,1%%%"
If %Chars%==%b% (Set /A T+=C,W+=C) Else Set /A T+=C,S+=C
GoTo :EOF
:NEXT
Set S= %S%
Set S=%S:~-11%
Set W= %W%
Set W=%W:~-11%
Set T= %T%
Set T=%T:~-11%
Echo Spares: %S%
Echo Service:%W%
Echo ===================
Echo Total: %T%
amel27,
гм... так всё-таки сначала дата, потом сумма?.. »пока для меня этот текстовичек был тупо памяткой расходов, сумма стояла первой, но как только я "подсчитал" расходы в первый раз, он как-то сам перескочил в разряд логов и я тутже (спасибо Евгению за FAR) поменял столбцы местами...
возникла пара вопросов:
1. Как называется тег для раскрывающегося текста ("читать дальше »")? Раньше не озадачивался, а сейчас потерял на форуме тему с описанием тегов.
2. Для каких целей брать все выражение в set в двойные кавычки? (Н: Set "C=%C:.=&REM.%")
3. Использование "&REM." в вышеуказанной строчке... это чтобы получить типа такого: set C=4 & rem Пример?
4. Дополнительное оборачивание в символ процента в Call Set "b=%%Chars:%ch:~0,1%=%ch:~0,1%%%" - для задержки преобразований, чтобы получить 2 этапа обработки?
NiOl, 1. more : ) ; 2. отключение интерпретации спецсимволов строки; 3. угу, и отбросить всё что оказалось справа первого вхождения. 4. yes.
вариант с учетом копеек:@Echo Off
Set Chars=abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя
For /F "Usebackq Tokens=2* Delims= " %%P In ("%~n0.txt") Do If Not %%P_==_ If Not %%Q_==_ (
For /F "Tokens=1,2 Delims=.," %%A In ("%%P") Do Set H=%%A& Set L=%%B& Set "ch=%%Q"& Call :CALC)
GoTo :NEXT
:CALC
Set H=%H: =%& Set L=%L%00
Set H=%H:'=%& Set L=%L:~0,2%
Set /A L=1%L%%%100
Set /A C=%H%00+%L%
Call Set "b=%%Chars:%ch:~0,1%=%ch:~0,1%%%"
If %Chars%==%b% (Set /A T+=C,W+=C) Else Set /A T+=C,S+=C
GoTo :EOF
:NEXT
Set S= %S:~0,-2%.%S:~-2%
Set S=%S:~-11%
Set W= %W:~0,-2%.%W:~-2%
Set W=%W:~-11%
Set T= %T:~0,-2%.%T:~-2%
Set T=%T:~-11%
Echo Spares: %S%
Echo Service:%W%
Echo ===================
Echo Total: %T%
amel27, волшебно! :yahoo:
1. насколько понял, "до кучи" перерабатываются в нормальный вид "красивые" числа типа 1 200 или 1'200 - может пригодиться при "импорте"
2. вот здесь мне показалось черезчур смело: Set /A C=%H%00+%L% - все эти "автоматические преобразования типа" меня настолько раздражают, что я бросил изучать Перл, хотя возлагал на него большие надежды, но цель достигнута!
* использую сей код с легкими переделками: описание процедуры в самый конец и удаление перехода "NEXT", вынос расчета общей суммы в конец (Все-таки CMD обрабатывает скрипты неторопясь и процентов 10 времени съеэкономить этим удасться).
Соклубники!
- У кого есть а/м
- и при этом если Вам интересно учесть расходы на своего железного помошника (не знаю кто как называет свою машину)
- и при этом Вас устраивает фиксация затрат в виде обычного текстового файла (который можно с легкостью просмотреть как на любом компе под любой ОСью, так и на современных телефонах - в чем сама прелесть TXT и заключается)
ТО РЕКОМЕНДУЮ ЛЮБИТЬ И ПОЛЬЗОВАТЬ СКРИПТ тов.Amel27 !!!
пример структуры TXT-файла и выдаваемый результат: 2009.12.20 270 Омыватель 5л. с носиком
2010.01.06 1185 Рулевое колесо
2010.01.09 2500 Зарядное "Автоэлектрика" Т1001
2010.01.09 410 Канистра 10л
2010.01.09 260 Свечи Bosch WR7DC
2010.01.09 180 мойка
2010.01.10 330 регулирование зажигания стробоскопом
2010.01.27 800 осмотр ходовой, замена крабов
2010.01.30 1040 ШРУС наружний LOBRO герм.
2010.01.30 2700 Механизм рул. управления (рейка) PILEN
2010.01.30 1400 Подшипник ступицы передний SKF 2шт
2010.01.30 1220 Домкрат FLOOR/Hallitonkki 2т
2010.01.30 50 пукнуть в шины
2010.02.06 760 балансировка колес с мойкой* столбцы отделены друг от друга одним символом табуляции, кодировка 866 или OEM DOS
результата:Spares: 10985.00
Service: 2120.00
===================
Total: 13105.00
зы: есть еще одна идейка по расширению, но я пока промолчу, чтоб не быть эгоистом... ;)
ТО РЕКОМЕНДУЮ ЛЮБИТЬ И ПОЛЬЗОВАТЬ СКРИПТ тов.Amel27 !!! »
Ну для подсчета расходов на А/М проще изначально добавить столбик запчасть/работа и использовать электронную таблицу. А само по себе распознавание может и пригодится.
NiOl, 1. yes. 2. точно! забыл главную команду, ради которой собственно копейки и выравнивались ноликами до двух знаков (исправил):Set /A L=1%L%%%100
РЕКОМЕНДУЮ ЛЮБИТЬ И ПОЛЬЗОВАТЬ СКРИПТ тов.Amel27 !!! »это не мой, а твой/наш скрипт - доделывать всегда проще, чем писать с нуля... тем более мой интерес тут скорей "спортивный" (передвигаюсь исключительно ОТ : ) - в т.ч. испытать арифметику рациональных чисел в батнике - эмоции спишем на полезность скрипта автору топика... ; )
"автоматические преобразования типа" меня настолько раздражают, что я бросил изучать Перл, хотя возлагал на него большие надежды »ну и зря, мода приходит и уходит... а всем "инструментам" присущ один недостаток: результат целиком зависит от того, кто их использует... ; )
использовать электронную таблицу »не-е-е... не понимаете всю прелесть свободы от привязки к конкретным OS/Soft + умение использовать то, что всегда под рукой... гм... интересно, можно ли что-то подобное выжать из батников DOS?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.