Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как "красиво" распознать Строчные/Прописные буквы?

Ответить
Настройки темы
CMD/BAT - [решено] Как "красиво" распознать Строчные/Прописные буквы?

Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 17:37, 15-06-2010

 

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1273
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата 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 начинается с маленькой буквы
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:15, 15-06-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:09, 16-06-2010 | #3


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


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

-------
Как сказало Дерево Дровосеку: "я - пень".


Отправлено: 10:31, 16-06-2010 | #4


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


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

-------
Как сказало Дерево Дровосеку: "я - пень".

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:21, 17-06-2010 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата 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%
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:19, 18-06-2010 | #6


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:40, 18-06-2010 | #7


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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, 20-06-2010 в 05:23. Причина: +код

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:54, 18-06-2010 | #8


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


amel27, волшебно!

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


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

Отправлено: 22:36, 19-06-2010 | #9


Аватара для seriych

Старожил


Сообщения: 182
Благодарности: 42

Профиль | Отправить PM | Цитировать


Цитата NiOl:
ТО РЕКОМЕНДУЮ ЛЮБИТЬ И ПОЛЬЗОВАТЬ СКРИПТ тов.Amel27 !!! »
Ну для подсчета расходов на А/М проще изначально добавить столбик запчасть/работа и использовать электронную таблицу. А само по себе распознавание может и пригодится.

-------
* Книгой можно не только стаканчик с лапшой накрывать. ©


Отправлено: 23:28, 19-06-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как "красиво" распознать Строчные/Прописные буквы?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Прописные и строчные буквы Bazaroff Microsoft Windows 95/98/Me (архив) 2 04-05-2010 21:17
Интерфейс - [решено] Как удалить папку "Моя музыка","Мои Картинки", "Мое видео"? verdix Microsoft Windows 2000/XP 3 03-10-2009 23:46
После установки Windows Xp меняются буквы дисков "C" и "D"!!! ProgrammerPC Автоматическая установка Windows 2000/XP/2003 3 26-09-2009 20:12
Delphi - Можно ли запретить в "Edit" вводить буквы? ShadowMas Программирование и базы данных 10 19-12-2008 13:06
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") submaster Microsoft Windows NT/2000/2003 5 13-09-2006 12:29




 
Переход