Компьютерный форум 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=260897)

JackL 20-05-2013 13:08 2152950

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

Т.е. есть файл text.txt вида (автоматически сохраняется в папке, при приходе этого письма «the Bat»-ом):

Код:

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
От:      alex@gmail.com <alex@gmail.com>
Кому:   
Написано: 20 мая 2013 г., 11:24:37
Тема:    Заявка
Файлы:    Письмо.html
--====----====----====----====----====----====----====----====----====----===--
Здравствуйте, Алексей.
 
Пользователь Алексей заказал оформление.
 
Контактные данные:
имя: Алексей
телефон: 8654975431
e-mail: 3197087@mail.ru


Автомобиль: KIA

Водители:
Женщина, 30 лет, стаж 2 года
 
Мужчина, 40 лет, стаж 5 лет
 
Страховая компания: РЕСО-Гарантия
 
Стоимость: 1 000 рубей
 
 
---
C уважением,
Алексей
mail@on.ru
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Есть файл текст с описанием Страховых компаний text2.txt (можно организовать по-разному, как удобнее для обработки).

Код:

РЕСО-Гарантия. Открытое страховое акционерное общество "РЕСО-Гарантия" основано в 1991 году. Входит в группу РЕСО, объединяющую ряд    компаний, в том числе и страховых, работающих как на территории РФ, так и за ее….
ОРАНТА. Страхование ведет свою историю с 1995 года и сегодня является одним из весомых операторов на российском рынке.
и т.д.

Какая задача?
1) При получении письма в папке появляется файл text.txt.
2) На основании этого файла надо создать файл out.txt (убирается верх и низ файла text.txt, а по названию страховой компании подставляется вниз текст из файла text2.txt)

Код:

Пользователь Алексей заказал оформление.
 
Контактные данные:
имя: Алексей
телефон: 8654975431
e-mail: 3197087@mail.ru


Автомобиль: KIA

Водители:
Женщина, 30 лет, стаж 2 года
 
Мужчина, 40 лет, стаж 5 лет
 
Страховая компания: РЕСО-Гарантия
 
Стоимость: 1 000 рубей

Открытое страховое акционерное общество "РЕСО-Гарантия" основано в 1991 году. Входит в группу РЕСО, объединяющую ряд    компаний, в том числе и страховых, работающих как на территории РФ, так и за ее….

3) Отправка получившегося файла out.txt, как текста письма, по адресу указанному в нутрии файла text.txt или out.txt “e-mail: 3197087@mail.ru
4) Перенесение файлов text.txt и out.txt в архив.

Foreigner 20-05-2013 20:14 2153154

Код:

@echo off
setlocal

for /f "tokens=1 delims=:" %%i in (' findstr /n /c:"---" text.txt ') do (

    if not defined start ( set /a "start=%%i+1" ) else ( set /a "stop=%%i-1" )

)

1>1.tmp more +%start% text.txt
1>2.tmp more +%stop% text.txt

1>out.txt (

    findstr /v /b /e /g:2.tmp 1.tmp
    for /f "tokens=2 delims=:" %%i in (1.tmp) do findstr "%%i" text2.txt
)

for /f "tokens=2 delims=:" %%i in ('findstr "e-mail" 1.tmp') do set "mail=%%i"

:: Как отправлять решайте сами, у меня нет консольной отправлялки почты

echo sending file out.txt to %mail%

:: Переносим в "архив". Здесь не все ясно, поэтому echo

for %%i in (text.txt out.txt) do echo move %%i C:\Archive

del *.tmp

ЗЫ. В text2.txt название страховой компании должно быть ТОЛЬКО на одной строке и все описание там же.

ЗЫЫ. Батник не лучший вариант для обработки текста, особенно кириллицы.

JackL 21-05-2013 00:21 2153261

Foreigner, Спасибо.

С отправкой на майл все получилось. Спасибо. Но вот из файла text2.txt в итоговый файл out.txt подставляется всегда первая строка с описанием страховой из списка. А надо, что бы имя страховой в text.txt совпадало с добавляемым описанием из text2.txt

Еще раз Спасибо, Foreigner. Просьба помочь добить задачу.

Foreigner 21-05-2013 07:35 2153320

JackL, Попробуйте изменить:
Код:

...

1>1.tmp more +%start% text.txt
1>2.tmp more +%stop% text.txt

for /f "tokens=2 delims=:" %%i in ('find "Страховая компания" 1.tmp') do set "ins=%%i"

1>out.txt (

    findstr /v /b /e /g:2.tmp 1.tmp
    for /f "tokens=1,2 delims=#" %%i in (text2.txt) do if " %%i"=="%ins%" echo %%j
     
)

...

При условии, что формат text2.txt будет:
Код:

Ресо#Езжайте на Нагорную и ждите оценщика
Оранта#Основана в 1905 году. Бла Бла
Росгорстрах#Что-то там про компанию
Чижик-Пыжик#Где ты был?

Т.е. разделитель "#" в строке "insurance company#description"

Батник должен быть в кодировке windows-1251

Georgio 21-05-2013 10:32 2153368

Цитата:

Цитата JackL
3) Отправка получившегося файла out.txt, как текста письма, по адресу указанному в нутрии файла text.txt или out.txt “e-mail: 3197087@mail.ru
4) Перенесение файлов text.txt и out.txt в архив. »

-- с зтими пунктами задания нужно разбираться "чисто конкретно" (да и особого желания нет).



А по пунктам 1) и 2) вот такое решение:


Код:

@ECHO OFF>out.txt

SETLOCAL ENABLEDELAYEDEXPANSION

SET Number_of_Skipping_Strings_from_the_Beginning=9

SET Number_of_Skipping_Strings_from_the_End=6

FOR /F "tokens=1* delims=:" %%I IN ('FINDSTR /N /R . text.txt^&^&ECHO.^&^&FINDSTR /N /R /V . text.txt') DO IF DEFINED Number_of_Strings (IF %%I GTR !Number_of_Strings! SET Number_of_Strings=%%I) ELSE SET Number_of_Strings=%%I

SET /A VAR1=Number_of_Strings-Number_of_Skipping_Strings_from_the_End

FOR /L %%I IN (1,1,!Number_of_Strings!) DO FOR /F "tokens=1* delims=:" %%J IN ('FINDSTR /N /R . text.txt^&^&ECHO.^&^&FINDSTR /N /R /V . text.txt') DO IF %%I==%%J IF %%I GTR %Number_of_Skipping_Strings_from_the_Beginning% IF %%I LEQ %VAR1% SET VAR2=%%K&IF DEFINED VAR2 (SET VAR3=!VAR2: =!&IF DEFINED VAR3 (ECHO %%K>>out.txt) ELSE ECHO.>>out.txt) ELSE ECHO.>>out.txt

FOR /F "tokens=1,2* delims=: " %%I IN (text.txt) DO IF "%%I %%J"=="Страховая компания" FOR /F "tokens=1* delims=." %%L IN (text2.txt) DO IF %%L==%%K ECHO %%L.%%M>>out.txt



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

Georgio 22-05-2013 13:51 2153996

Этот скрипт делает то же самое, что и предыдущий, только используется FIND вместо FINDSTR. В результате одним циклом меньше.

Код:

@ECHO OFF>out.txt

SETLOCAL ENABLEDELAYEDEXPANSION

SET Number_of_Skipping_Strings_from_the_Beginning=9

SET Number_of_Skipping_Strings_from_the_End=6

FOR /F %%I IN ('FIND /C /V ""^<text.txt') DO SET Number_of_Strings=%%I

SET /A VAR1=Number_of_Strings-Number_of_Skipping_Strings_from_the_End

FOR /F "tokens=1* delims=[]" %%I IN ('FIND /N /V ""^<text.txt') DO (
 IF %%I GTR %Number_of_Skipping_Strings_from_the_Beginning% (
  IF %%I LEQ %VAR1% (
  SET VAR2=%%J
  IF DEFINED VAR2 (
    SET VAR3=!VAR2: =!
    IF DEFINED VAR3 (
    ECHO %%J>>out.txt
  ) ELSE (
    ECHO.>>out.txt
)) ELSE (
    ECHO.>>out.txt
))))

FOR /F "tokens=1,2* delims=: " %%I IN (text.txt) DO (
 IF "%%I %%J"=="Страховая компания" (
  FOR /F "tokens=1* delims=." %%L IN (text2.txt) DO (
  IF %%L==%%K ECHO %%L.%%M>>out.txt
)))


JackL 26-05-2013 12:51 2156506

Огромное Спасибо, Georgio и Foreigner! Все получилось.


Время: 05:59.

Время: 05:59.
© OSzone.net 2001-