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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Нужен BAT файл (http://forum.oszone.net/showthread.php?t=29755)

Domovoi 24-11-2003 19:15 205624

Нужен BAT файл
 
Добрый денб.
Есть файл формата TXT с кучей информации. Мне оттуда надо выбратьнекоторую информацию, скажем телефоны. Шаблон такой т. хххххх . И перебросить в новый файл в котором этот номер будет выглядить примерно так ";"." "."номер телефона". "какая-то цифра все время постоянна"
Как это сделать как можно проще? По идеи можно же и в БАТ файле с помощью комманд. Но я их уже давно не помню, а надо быстро.
Спасибо за внимание.

Prisoner 25-11-2003 01:16 205625

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

bgg0408 25-11-2003 01:40 205626

Domovoi
Мне кажется, что здесь ВАТником не обойтись. Надо скриптик на Перле написать :) ИМХО, ВАТники не умеют считываь инфу из файла. Вот переименовывать, копировать - пожалуйста. Дописывать - тоже. Как вариант, можно реализовать программу с нужными функциями на Паскале, Си, Бейсике и любом другом более-менее приличном языке.

shurikan 25-11-2003 03:03 205627

Domovoi
Да, уж. BAT для DOS-а не то, что bash под *nix-ом. Последний может.
Могу навалять програмулю на C, если не предпочтешь сделать сам. На всякий случай уточняю:
допустим встречается где-то в файле запись т. 555123 - ее надо преобразовать в ;. .555123.Ц, где Ц некая цифра. В процессе разбора одного файла Ц не меняется. Выходная инфа пишется в столбик. Имена входного и выходного файлов, а также Ц задаются как параметры программы в командной строке. Так?

Решение за тобой! :)

Domovoi 25-11-2003 23:06 205628

Текстовый файл очень разрозненный по сути БД но телефоны находятся где попало, не только в нужном поле, а надо вытащить все. BAT не смогу, уже пробовал, результат не впечатлил.

встречается надпись такая:
тел. 11-11-11
тел. 111111
тел.111111
тел.11-11-11
т. 111111
т. 11-11-11
т.  111111
т.111111
т.11-11-11

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

выходная выглядит так:
"":"";"";"";"";"111111";"";&qu ot;"

вот в приципе и все.
Да забыл сказать файлик весит около 100 метров.

Guest 26-11-2003 00:01 205629

2 bgg0408,Prisoner вообще то батником можно из файла читать и все такое ... только не command.com который из DOS/Win 9x, а cmd.exe который в Win 2k/XP ... хотя конечно до юниксовых шелов ему далеко ...

bgg0408 26-11-2003 01:30 205630

to Guest
Пример, пожалуйста, в студию!!!:gigi:
А чем Перл плох? По-моему самое то.

Prisoner 26-11-2003 02:01 205631

Domovoi
В таком случае рекомендую язык высокого уровня... кстати фишку с "тел" и "т" можно победить простой заменой в тексте.

PS shurikan, вызвался вам помочь (меня радует его благотворительность), так попробуйте договориться с ним.

shurikan 26-11-2003 03:28 205632

Domovoi
Я готов, только все равно не понимаю формат вывода (слишком много кавычек). Нельзя ли тройку примеров, как в реале должен выглядеть вывод. Например:
есть такие подстроки -
... т.123178... ... тел. 189990 т. 675419...
А вот так д. выглядеть вывод:
(:123178)
(:189990)
(:675419).
Скобки к делу не относятся. Я имею ввиду, что внутри скобок, не затененные кавычками, видны все нужные символы. М.б. это д.б. так (:;;; 12 31 78)?
Напиши этот формат примерно, как показал. Будет понятнее. ОК? :)

Добавлено:

Да, это под какой системой?

Добавлено:

Еще одна мысль пришла в голову. Может там еще и факсы есть? Тогда укажи нужны ли они и как они сокращаются, если сокращаются. Может быть с телефонами комбинируются т./ф. тел./факс? :)

Domovoi 26-11-2003 10:23 205633

Prisoner
Простая замена не поможет так как это кусок с БД. Там иногда ни к чему встречаются буквы Т или написано Т, а телефона нет.


shurikan
Формат вывода.
Да пусть будет просто номера телефонов в столбик а txt файл, дальше сам сделаю, тем более что там и делать ничего практически не останеться.
вывод должен быть таким:

123454
564544
454235
675464
Все номера 6-сти значные.

PS хорошо бы еще в другой выходной файл запихнуть список мобильных телефонов. Нач-ся с: моб формат :89103333333 или 8-903-333-33-33
....
если важно (или интересно формат вывода:
(
"";"";"";"";"";"";"";"&qu ot;;"410570";""
"";"";"";"";"";"";"";"&qu ot;;"410676";""
"";"";"";"";"";"";"";"&qu ot;;"410737";""
"";"";"";"";"";"";"";"&qu ot;;"410742";""
"";"";"";"";"";"";"";"&qu ot;;"410743";""
)

Как  выглядит текст (исходник)

тел. 44-96-42БРЯНСКАЯ обл., БРЯНСК, 22 СЪЕЗДА КПСС ул., д. ХХ, кв. ХХ, ком.БРЯНСКАЯ обл., БРЯНСК, 22 СЪЕЗДА КПСС ул., д. 27, кв. ХХ, ком.
БРЯНСКАЯ обл., БРЯНСК, ДУКИ ул., д. ХХ, кв. 12, ком.БРЯНСКАЯ обл., БРЯНСК, ДУКИ ул., д. ХХ, кв. 12, ком.
БРЯНСКАЯ обл., БРЯНСК, КРАСНОАРМЕЙСКАЯ ул., д. ХХ, кв. ХХ4, ком.БРЯНСКАЯ обл., БРЯНСК, КРАСНОАРМЕЙСКАЯ ул., д. ХХ, кв. ХХ, ком.
БРЯНСКАЯ обл., БРЯНСКБРЯНСКАЯ обл., БРЯНСК
БРЯНСКАЯ обл., БРЯНСК, АВИАЦИОННАЯ ул., д. , кв. 9, ком.БРЯНСКАЯ обл., БРЯНСК, АВИАЦИОННАЯ ул., д. , кв. 9, ком.
БРЯНСКАЯ обл., БЕЛЫЕ БЕРЕГА, ЛЕНИНА ул., д. ЯЯкв. Я, ком.БРЯНСКАЯ обл., БЕЛЫЕ БЕРЕГА, ЛЕНИНА ул., д. ЯЯв. Я ком.
БРЯНСКАЯ обл., БРЯНСК, АБАШЕВА ул., д. 6, кв. ЯЯ, ком.БРЯНСКАЯ обл., БРЯНСК, АБАШЕВА ул., д. 6, кв. ЯЯ, ком.
БРЯНСКАЯ обл., КЛИНЦЫ, МИРА ул., д. ЯЯ, кв. ЯЯ, ком.БРЯНСКАЯ обл., КЛИНЦЫ, МИРА ул., д. ЯЯ, кв. ЯЯ, ком.
з/п 3300,  жена Ирина Мих. - 41 год - кладовщик, падчер. Катя - 19 лет студ.г. Брянск,  ул. Домбасская, ЯЯ - 72г. Брянск,  ул. Горбатова, 7 - ЯЯ,   т. 753008
БРЯНСКАЯ обл., НОВОЗЫБКОВ, ГВАРДЕЙСКАЯ ул., д. ЯЯ, ком.БРЯНСКАЯ обл., НОВОЗЫБКОВ, ГВАРДЕЙСКАЯ ул., д. ЯЯ, ком.
БРЯНСКАЯ обл., БРЯНСК, БЕЖИЦКАЯ ул., д. ЯЯ, ком.БРЯНСКАЯ обл., БРЯНСК, БЕЖИЦКАЯ ул., д. ЯЯ, ком.
БРЯНСКАЯ обл., ФОКИНО, ПРИВОКЗАЛЬНАЯ ул., д. 5, кв. 5, ком.БРЯНСКАЯ обл., ФОКИНО, ПРИВОКЗАЛЬНАЯ ул., д. 5, кв. 5, ком.
з/п-4000; жена:Галина Александровна-53г.; сын:Саша-24г.г.Клинцы,ул.Калинина,ЯЯ; (Кв-ра 64кв.м.- сов.дол.приват.)   т.(236) 57498Гараж,ГСК-2.


Добавлено:

Факсы встречаются но они не нужны

Выводной файл txt виндовский формат текста.
У меня стоит 2000 проф. SP 3

shurikan 27-11-2003 00:44 205634

Domovoi
Понял, сделаем.
:)

Добавлено:

Да, тебе исходник или exe-шник? Если исходник, будет на BC++ Builder 6.

Добавлено:

Еще! Черкани мне на e-mail пару строк, чтобы я мог ответить со вложением. ОК?:)

Domovoi 29-11-2003 01:49 205635

shurikan
Как успехи?
Ps на мыло отправил письмецо...

shurikan 30-11-2003 04:39 205636

Domovoi
Лови, отправил!
:)

Добавлено:

Программа отыскивает 6-значные местные номера и 11-значные номера мобильников. Может и междугородные нужны? Надо было бы раньше спросить... Если нужно - поправим. :)

Prisoner 30-11-2003 10:03 205637

Будет просьба дальнейший диалог вроде
Цитата:

Лови, отправил!
 вести по почте. Здесь - все что касается первоначальной проблемы. Заранее спасибо.


Lamo 23-04-2004 15:25 205638

All
Вопрос вот в чем:

На клиентских машинах один из модулей системы постоянно
обновляет базу (и еще кой какую фигню) с удаленного сервера
при этом обновления идут в следующем порядке


Драйв:\Каталог\Обновление.001
Драйв:\Каталог\Обновление.002
Драйв:\Каталог\Обновление.003
................
Драйв:\Каталог\Обновление.999

самое "новое" обновление ессно с большим номером в расширении

проблема вот в чем - каждое  обновление
является полнофункциональным,
т.е. предыдущие куски не нужны...
но софт предыдущие сам не удаляет и со временем
накапливается достаточно большое кол-во этого мусора
и "ручками" мне его удалять достало

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

Мне нужны только стандарные команды
comman.com`a (cmd.exe) -
очень хотелось бы обойтись без всяких расширителей

Вроде особо сложного то ничего - бат справиться должен,
у меня загвоздка в вычислении самого большого номера...  

Prisoner 24-04-2004 04:03 205639

Упрощенный вариант:
Код:

@echo off
dir sort /B /O-N > files.lst
FOR /F "skip=1" %%i IN (files.lst) DO @del sort\%%i

Здесь код командника лежит в файле, а каталог с которым проводится работа называется sort и лежит он в том же каталоге, что и сам командник. Пойдет?

Lamo 24-04-2004 12:17 205640

Prisoner
Тут вот еще что - в каталоге
кроме обновлений лежат и оч.нужные файлики
(длл-и, ехе-шки и т.п.)
их нужно отсечь из списка
и работать только с

Драйв:\Каталог\Обновление.001
Драйв:\Каталог\Обновление.002
Драйв:\Каталог\Обновление.003
................
Драйв:\Каталог\Обновление.999

(имена файлов обновлений всегда одинаковы -
отличия только в расширении, а оно всегда числовое)

Все вопрос отпал -
Код:

@echo off
dir sort\обновление.* /B /O-N > files.lst
FOR /F "skip=1" %%i IN (files.lst) DO @del sort\%%i

добавил маску и все ОК
Prisoner еще раз Thnx :beer:



[s]Исправлено: Lamo, 20:55 24-04-2004[/s]

Lamo 26-04-2004 08:45 205641

Цитата:

добавил маску и все ОК
Млин было ОК :(
пока не добрался до машин с win9х
там FOR не понимает расширенный набор,
т.е. внутрь файла/локации он не заходит
и отругивается... :(

есть еще какие-нибудь соображения
как листинг заставить перебирать ?

Prisoner 28-04-2004 04:43 205642

Цитата:

т.е. внутрь файла/локации он не заходит
и отругивается...
Это как? Имеется ввиду не перебираетвсе строки из файла-листинга?
Я право уже успел забыть (угу, легко забыть когда не знаешь :)) все о эмуляции ДОС под 9х, но ваш вопрос "решил" путем чтения помощи (for /?). Может поможет?

Lamo 28-04-2004 06:22 205643


Prisoner
Цитата:

"решил" путем чтения помощи (for /?). Может поможет?
Вот все что выдает Help по этому делу
Цитата:

Запуск указанной команды для каждого из файлов в наборе.

FOR %переменная IN (набор) DO команда [параметры]

*%переменная *Подставляемый параметр.
*(набор) * * *Набор, включающий один или более файлов. *
* * * * * * * Допускается использование подстановочных знаков.
*команда * * *Команда, выполняемая для каждого из файлов в наборе.
*параметры * *Параметры и ключи, необходимые для выполнения команды.

При использовании команды FOR в пакетном файле вместо записи %переменная
следует использовать запись %%переменная.
Извини, но я просто не соображу как это может помочь, -
внуть файлов он заходить ИМХО не умеет,
обороты типа
Цитата:

@FOR /F "skip=1" %%i IN ('dir sort\обновления.* /B /O-N') DO @del sort\%%i
он не понимает
а
как "присвоить" листинг какой-нидь переменной,
я сообразить немогу...


[s]Исправлено: Lamo, 6:25 28-04-2004[/s]

hasherfrog 28-04-2004 11:21 205644

Lamo
Рискну предложить:
Код:

>  temp.bat echo @prompt set last_update=
>> temp.bat dir /b /o-n c:\обновления.*
   @call temp.bat > nul
   @del temp.bat
   for %%file in (c:\обновления.*) do if not %last_update == %%file del %%file
   set last_update=

Знаки >, >> не убирайте, они нужны. Не очень уверен в синтаксисе, впрочем. Под рукой нет 9х.

hasherfrog 05-05-2004 13:23 205645

Lamo
Так, чего-то не работает этот @prompt как ожидалось.
Сделаем по-другому:
1. Создаем файлик pre.cmd
2. Пишем там
Код:

set last_update=
Внимание! Возврата каретки не должно быть! файл содержит строку, которая не кончается <eol>!
3. Собственно батник:
Код:


> dirlist.lst dir /b /o-n c:\обновления.*
  copy /b pre.cmd+dirlist.lst temp.bat
  @call temp.bat > nul
  for %%file in (c:\обновления.*) do if not %last_update == %%file del %%file
  set last_update=
  @del temp.bat
  @del dirlist.lst

Т.о. при работе батника список файлов будет слит с файлом pre.cmd в файл temp.bat. При выполнении temp.bat первая строка установит переменную last_update в имя самого последноего обновления. Остальные строки дадут кучу ошибок, но мы их сливаем в nul. Потом, зная последний last_update, стираем все другие файлы, а затем чистим за собой.
PS. Давая предыдущий пост, я считал, что использование @prompt не даст <eol> после echo, но это не так. Попробуйте данный вариант с pre.cmd, и плз, ответьте, получилось ли у Вас желаемое.
PPS. Опять-таки, не всё нормально в синтаксисе, надо доработать рашпилем :)

Lamo 05-05-2004 14:12 205646

hasherfrog
Thnks.
Вечером доберусь до той машины - попробую и отпишу


Время: 04:39.

Время: 04:39.
© OSzone.net 2001-