Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как "красиво" распознать Строчные/Прописные буквы? (http://forum.oszone.net/showthread.php?t=178243)

NiOl 15-06-2010 17:37 1434671

Как "красиво" распознать Строчные/Прописные буквы?
 
Ради интереса веду "лог" затрат на свое "корыто".
Формат таков:
сумма[TAB]дата[TAB]сабж
при этом если поле сабж начинается с маленькой буквы, то это "работы", а с большой - "запчасти".
сегодня задумался, сколькож я потратил и быстренько накатал батничек для подсчета общей суммы. Но поскольку в самом логе уже заложено разделение работ и запчастей, захотелось "добавить" разделение общей суммы на составляющие, но как оказалось отличить строчные/прописные буквы весьма проблематично. Во всяком случае сделать это "красиво", не увеличивая существенно время выполнения батника так и не удалось.

Никто не сталкивался с подобными задачами? Может поделитесь опытом?

El Sanchez 15-06-2010 21:15 1434817

Цитата:

Цитата NiOl
сумма[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 начинается с маленькой буквы


amel27 16-06-2010 06:09 1435005

ну да, при всём богатстве выбора... из штатных кроме 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:

NiOl 16-06-2010 10:31 1435103

Всем спасибо!
Вот у меня тоже пришлось findstr задействовать, но в отличае от варианта, предложенного amel27, вышло не 2 прохода, а аж целых 3.

NiOl 17-06-2010 17:21 1436106

Все уже, получил нужные циферки, но сама идея различить строчные/прописные буквы только средствами 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%! требует включения этого режима, то попробовал включать режим непосредственно перед указанной строкой, а следом отключать - при этом в итогах также получал одни нули.

amel27 18-06-2010 06:19 1436448

Цитата:

Цитата NiOl
usebackq tokens=2,3 »

гм... так всё-таки сначала дата, потом сумма?.. ;)
Цитата:

Цитата NiOl
для set при замене подстроки не важно, какой символ искать »

интересно, не думал что и для русских так же... учитывая половинчатую локализацию CMD
по ходу M$ забыли для SET ключик /I аналогично IF :)
Цитата:

Цитата NiOl
Неинициализированные в основном теле переменные (в моем случае S и W) работают как локальные »

не заметил... возможно, это связано с переносами SetLocal - она ограничивает область видимости
Цитата:

Цитата NiOl
наличие записи 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%


NiOl 18-06-2010 13:40 1436740

amel27,
Цитата:

Цитата 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 этапа обработки?

amel27 18-06-2010 14:54 1436806

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%


NiOl 19-06-2010 22:36 1437634

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



зы: есть еще одна идейка по расширению, но я пока промолчу, чтоб не быть эгоистом... ;)

seriych 19-06-2010 23:28 1437646

Цитата:

Цитата NiOl
ТО РЕКОМЕНДУЮ ЛЮБИТЬ И ПОЛЬЗОВАТЬ СКРИПТ тов.Amel27 !!! »

Ну для подсчета расходов на А/М проще изначально добавить столбик запчасть/работа и использовать электронную таблицу. А само по себе распознавание может и пригодится.

amel27 20-06-2010 06:28 1437725

NiOl, 1. yes. 2. точно! забыл главную команду, ради которой собственно копейки и выравнивались ноликами до двух знаков (исправил):
Код:

Set /A L=1%L%%%100
Цитата:

Цитата NiOl
РЕКОМЕНДУЮ ЛЮБИТЬ И ПОЛЬЗОВАТЬ СКРИПТ тов.Amel27 !!! »

это не мой, а твой/наш скрипт - доделывать всегда проще, чем писать с нуля... тем более мой интерес тут скорей "спортивный" (передвигаюсь исключительно ОТ :) - в т.ч. испытать арифметику рациональных чисел в батнике - эмоции спишем на полезность скрипта автору топика... ;)

Цитата:

Цитата NiOl
"автоматические преобразования типа" меня настолько раздражают, что я бросил изучать Перл, хотя возлагал на него большие надежды »

ну и зря, мода приходит и уходит... а всем "инструментам" присущ один недостаток: результат целиком зависит от того, кто их использует... ;)

Цитата:

Цитата seriych
использовать электронную таблицу »

не-е-е... не понимаете всю прелесть свободы от привязки к конкретным OS/Soft + умение использовать то, что всегда под рукой... гм... интересно, можно ли что-то подобное выжать из батников DOS?


Время: 10:23.

Время: 10:23.
© OSzone.net 2001-