imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 10.01.2006, 22:30     # 1
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

crawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собой
Маленькая прога для автонумерации

Срочно требуется маленькая програмка/скриптик для перенумерации строк в текстовом файле по винду. Желательно досовский батчик или ВБ-скриптик.

Должна делать следующее:
Читать входной текстовой файл и перенумеровывать по порядку все незакомментированные строчки. Пустых строк нет.

Пример входного файла:
Код:
# Коммент
1 Строка 1
3 Строка 2
# еще коммент
5 Еще одна строка
На выходе должно быть:
Код:
# Коммент
1 Строка 1
2 Строка 2
# еще коммент
3 Еще одна строка
Если кому-то не в облом помочь - я буду бесконечно благодарен. Заранее спасибо.
crawler вне форума  
Старый 11.01.2006, 07:24     # 2
Ghost
::VIP::
Звезда первого сезона
Молчун-2004
 
Аватар для Ghost
 
Регистрация: 24.08.2002
Сообщения: 1 575

Ghost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех Гуру
Файл myren.cmd:
Код:
@echo off
if "%1"=="" exit
if not exist %1 exit
set tmp_file=%TEMP%\myren.tmp
if exist !tmp_file! del /f /q !tmp_file!
set num=0
for /f "tokens=1* delims= " %%i in (%1) do (
  if not %%i==# (
    set /a num+=1
    echo !num! %%j>>!tmp_file!
  ) else (
    echo %%i %%j>>!tmp_file!
  )
)
type !tmp_file!>%1
del /f /q !tmp_file!
Вызывать так:
Код:
@cmd /v:on /c myren.cmd readme.txt
Здесь вместо 'readme.txt' нужно подставить имя файла, который необходимо обработать. Приведенный тобой пример обрабатывается правильно.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!
Ghost вне форума  
Старый 11.01.2006, 10:05     # 3
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
Не совсем правильно отрабатывает, т.к. заменяет первое слово на порядкой номер строки и из
Цитата:
# Коммент
1 Строка 1
Строка 2
# еще коммент
3 Еще одна строка
получается
Цитата:
# Коммент
1 Строка 1
2 2
# еще коммент
3 Еще одна строка
_Lynx_ вне форума  
Старый 11.01.2006, 10:34     # 4
Ghost
::VIP::
Звезда первого сезона
Молчун-2004
 
Аватар для Ghost
 
Регистрация: 24.08.2002
Сообщения: 1 575

Ghost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех Гуру
_Lynx_
В задаче сказано перенумеровать, т.е. изменить номер. Другими словами, строка всегда начинается либо с символа комментария, либо с номера, отделенных от остальной части строки пробелом. В твоем примере это не так - строка не содержит номера. В таком случае задача не может быть решена, поскольку никакая программа не сможет определить, является ли часть строки до первого пробела номером или значащим словом предложения - ведь таким словом может быть и число! Получается нечто из области искусственного интеллекта... Единственное, что можно сделать, это вставить проверку, что часть строки до первого пробела является числом - реализовать это достаточно сложно, но, думаю, можно.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!
Ghost вне форума  
Старый 11.01.2006, 10:37     # 5
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
Так наверное будет правильнее
Цитата:
@echo off
if "%1"=="" exit
if not exist %1 exit
set tmp_file=%TEMP%\myren.tmp
if exist !tmp_file! del /f /q !tmp_file!
set num=0
for /f "tokens=1* delims= " %%i in (%1) do (
if not %%i==# (
set /a num+=1
if %%i GEQ 0 (
if %%i LEQ 9 (
echo !num! %%j>>!tmp_file!
) else (
echo !num! %%i %%j>>!tmp_file!
)
) else (
echo !num! %%i %%j>>!tmp_file!
)
) else (
echo %%i %%j>>!tmp_file!
)
)
type !tmp_file!>%1
del /f /q !tmp_file!
н-дя... нечитаемо получилось - пробельчики из кода исчезли
ну да ладно, главное работает
_Lynx_ вне форума  
Старый 11.01.2006, 10:45     # 6
Ghost
::VIP::
Звезда первого сезона
Молчун-2004
 
Аватар для Ghost
 
Регистрация: 24.08.2002
Сообщения: 1 575

Ghost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех Гуру
Твои изменения в батнике не приведут к желаемому результату, поскольку условие
Код:
if %%i GEQ 0 (
if %%i LEQ 9 (
исключит числа, большие 9, а ведь файл вовсе не обязательно должен содержать только лишь девять строк... Мои слова подтверждает простенький пример:
Код:
@echo off
set a=12
if %a% GEQ 0 (
if %a% LEQ 9 (
echo %a%
)
)
Число 12 не выведется...

Лучше проверку сделать вот тоак:
Код:
@echo off
set a=12
set /a b=(a+1)-1
if %a%==%b% echo %a%
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!

Последний раз редактировалось Ghost; 11.01.2006 в 10:46. Причина: склероZzz...
Ghost вне форума  
Старый 11.01.2006, 14:03     # 7
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
Согласен.
Или брать первый символ

Хотя этого всё равно будет маловато. Например
Цитата:
21Строка лдова
отбросится "21Строка". Так что придётся искать первый нечисловой символ
_Lynx_ вне форума  
Старый 11.01.2006, 14:22     # 8
crawler
Full Member
 
Регистрация: 11.12.2002
Сообщения: 864

crawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собойcrawler Имеются все основания чтобы гордиться собой
Строк в файлe действително больше 100. А то бы я ручками все делал. Первое поле- можно стирать, там всегда будет цифра. Гораздо менее приятной неожиданностью оказалось что некоторые пишут комменты не отделяя от # - типа
Цитата:
#Легитимный коммент
Решил таким способом:
Код:
for /f "tokens=1* delims= " %%i in (%1) do (
  set fst=%%i
  if not "!fst:~0,1!"=="#" (
    set /a num+=1
    echo !num! %%j>>!tmp_file!
  ) else (
    echo %%i %%j>>!tmp_file!
  )
)
Всем огромное спасибо за потраченное время.

кстати, комманда
Код:
 setlocal ENABLEDELAYEDEXPANSION
позволяет не запускать cmd

Последний раз редактировалось crawler; 11.01.2006 в 14:53.
crawler вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 11:56.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.