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

aggressor_ 27-05-2012 14:56 1923378

Замена определённых символов и вставка текста.
 
Здравствуйте.

Подойдёт любой метод реализации (vbs/wsh/js, php и т.д.)

Возникла необходимость в пакетной обработке большого количества файлов.

Необходимо:
PHP код:

заменить на <
заменить на >
В начало вставить <list><item>
В конец вставить </item></list> 


Один из примеров
HTML код:

<h2><span style="font-style:italic;">some text!</span></h2>
<ol>
<li>some text!</li>
</ol>
<p style="text-align:justify; text-indent: 30px;">some text</p>

Вот что должно получиться после преобразования

PHP код:

<list><item>&lt;h2&gt;&lt;span style="font-style:italic;"&gt;some text!&lt;/span&gt;&lt;/h2&gt;
&
lt;ol&gt;
&
lt;li&gt;some text!&lt;/li&gt;
&
lt;/ol&gt;
&
lt;p style="text-align:justify; text-indent: 30px;"&gt;some text&lt;/p&gt;
</
item></list> 

И после этих изменений перенести текст в конкретный файл (к нему прописывается путь).
Т.е. из одного конкретного файла (например: C:\work\text.txt в нём уже находится обработанный текст) перенести в другой (например: C:\example\hard.xml), при этом удалив всё содержимое hard.xml
Будет 20 исходников и 20 конечных файлов, только наполнение каждый раз будет разное.
Кодировка конечных фалов должна быть UTF-8 (без BOM)
Помогите пожалуйста реализовать, это существенно облегчит мне работу :)

Anonymоus 27-05-2012 15:58 1923396

На bat это будет выглядеть вот так. Читает из файла in.txt, пишет в файл out.txt.
Код:

@Echo Off
SetLocal EnableDelayedExpansion
Echo ^<list^>^<item^>>out.txt
For /F "usebackq delims=" %%A In ("in.txt") Do (
        Set Var=%%A
        Set Var=!Var:^<=^&lt;!
        Set Var=!Var:^>=^&gt;!
        Echo !Var!>>out.txt
)
Echo ^</list^>^</item^>>>out.txt

Но вообще, bat - не лучший выбор для обработки файлов, содержащих '>', '<' и '&'. Кроме того, из-за EnableDelayedExpansion в обрабатываемом тексте исчезнут все восклицательные знаки.

aggressor_ 27-05-2012 16:07 1923400

Да, пожалуй bat не подойдёт, это ведь html файл и символов будет большое разнообразие.

aggressor_ 29-05-2012 13:23 1924437

Anonymоus, а можно добавить проверку на наличие файла?
Я вот сделал, но как-то наверно не совсем верно
Код:

@echo off

SetLocal EnableDelayedExpansion

if exist "C:\1\test\filiali1.txt" (
Echo ^<list^>^<item^>>C:\1\work\out.xml
For /F "usebackq delims=" %%A In ("C:\1\test\filiali1.txt") Do (
        Set Var=%%A
        Set Var=!Var:^<=^&lt;!
        Set Var=!Var:^>=^&gt;!
        Echo !Var!>>C:\1\work\out.xml
)
Echo ^</item^>^</list^>>>C:\1\work\out.xml
del "C:\1\test\filiali1.txt"
goto next
exit /b 0
)

echo Отсутствует файл filiali1.txt...
explorer /root,"C:\1\test"
goto next
pause



SetLocal EnableDelayedExpansion
:next
if exist "C:\1\test_2\perevod1.txt" (
Echo ^<list^>^<item^>>C:\1\work\perevod.xml
For /F "usebackq delims=" %%A In ("C:\1\test_2\perevod1.txt") Do (
        Set Var=%%A
        Set Var=!Var:^<=^&lt;!
        Set Var=!Var:^>=^&gt;!
        Echo !Var!>>C:\1\work\perevod.xml
)
Echo ^</item^>^</list^>>>C:\1\work\perevod.xml
del "C:\1\test_2\perevod1.txt"
exit /b 0
)

echo Отсутствует файл perevod1.txt...
explorer /root,"C:\1\test_2"
pause

Будет порядка 20 таких вставок и, я думаю, не лучший вариант использовать каждый раз goto

Anonymоus 29-05-2012 13:55 1924464

aggressor_, разумнее будет вместо копипаста всего кода, оформить функцией и вызывать уже её. Вам понятно из примера, как это делается?

Код:

@Echo Off
SetLocal EnableDelayedExpansion


Call :Replace "C:\1\test\filiali1.txt" "C:\1\work\out.xml"
If Not %ErrorLevel%==0 (
        Echo ERROR: File "filiali1.txt" not found
        Explorer /root,"C:\1\test"
)

Call :Replace "C:\1\test_2\perevod1.txt" "C:\1\work\perevod.xml"
If Not %ErrorLevel%==0 (
        Echo ERROR: File "perevod1.txt" not found
        Explorer /root,"C:\1\test_2"
)

Echo All done
Pause
Exit


:Replace
If "%*"=="" Echo USAGE: Call :Replace "infile" "outfile"
If Not Exist "%~1" Exit /B 1
Echo ^<list^>^<item^>>"%~2"
For /F "usebackq delims=" %%A In ("%~1") Do (
        Set Var=%%A
        Set Var=!Var:^<=^&lt;!
        Set Var=!Var:^>=^&gt;!
        Echo !Var!>>"%~2"
)
Echo ^</list^>^</item^>>>"%~2"
Exit /B 0


aggressor_ 29-05-2012 14:12 1924474

Да,понятно.
А в какую строку можно добавить удаление использованного файла?
Код:

del "C:\1\test\filiali1.txt"
del "C:\1\test_2\perevod1.txt"

и т.д.


Anonymоus 29-05-2012 14:18 1924480

Код:

If Not %ErrorLevel%==0 (
        Echo ERROR: File "perevod1.txt" not found        Explorer /root,"C:\1\test_2"
) Else (
        Del "C:\1\test_2\perevod1.txt"
)


aggressor_ 29-05-2012 14:23 1924483

Цитата:

Цитата Anonymоus
из-за EnableDelayedExpansion в обрабатываемом тексте исчезнут все восклицательные знаки. »

Я хотел бы уточнить, будут только восклицательные знаки удаляться или ещё какие-нибудь символы?

Anonymоus 29-05-2012 15:03 1924502

Исключительно восклицательные знаки, остальные символы, с которыми обычно в bat проблемы ('&', '|', etc.) можете использовать без опасений.

aggressor_ 29-05-2012 15:06 1924505

Спасибо за помощь!


Время: 02:24.

Время: 02:24.
© OSzone.net 2001-