IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Маленькая прога для автонумерации (http://www.imho.ws/showthread.php?t=98481)

crawler 10.01.2006 22:30

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

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

Пример входного файла:
Код:

# Коммент
1 Строка 1
3 Строка 2
# еще коммент
5 Еще одна строка

На выходе должно быть:
Код:

# Коммент
1 Строка 1
2 Строка 2
# еще коммент
3 Еще одна строка

Если кому-то не в облом помочь - я буду бесконечно благодарен. Заранее спасибо.

Ghost 11.01.2006 07:24

Файл 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' нужно подставить имя файла, который необходимо обработать. Приведенный тобой пример обрабатывается правильно.

_Lynx_ 11.01.2006 10:05

Не совсем правильно отрабатывает, т.к. заменяет первое слово на порядкой номер строки и из
Цитата:

# Коммент
1 Строка 1
Строка 2
# еще коммент
3 Еще одна строка
получается
Цитата:

# Коммент
1 Строка 1
2 2
# еще коммент
3 Еще одна строка

Ghost 11.01.2006 10:34

_Lynx_
В задаче сказано перенумеровать, т.е. изменить номер. Другими словами, строка всегда начинается либо с символа комментария, либо с номера, отделенных от остальной части строки пробелом. В твоем примере это не так - строка не содержит номера. В таком случае задача не может быть решена, поскольку никакая программа не сможет определить, является ли часть строки до первого пробела номером или значащим словом предложения - ведь таким словом может быть и число! Получается нечто из области искусственного интеллекта... :) Единственное, что можно сделать, это вставить проверку, что часть строки до первого пробела является числом - реализовать это достаточно сложно, но, думаю, можно.

_Lynx_ 11.01.2006 10:37

Так наверное будет правильнее
Цитата:

@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!
н-дя... нечитаемо получилось - пробельчики из кода исчезли
ну да ладно, главное работает

Ghost 11.01.2006 10:45

Твои изменения в батнике не приведут к желаемому результату, поскольку условие
Код:

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%

;)

_Lynx_ 11.01.2006 14:03

Согласен.
Или брать первый символ

Хотя этого всё равно будет маловато. Например
Цитата:

21Строка лдова
отбросится "21Строка". Так что придётся искать первый нечисловой символ

crawler 11.01.2006 14:22

Строк в файл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


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

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