Войти

Показать полную графическую версию : [решено] Замена определённых символов и вставка текста.


aggressor_
27-05-2012, 14:56
Здравствуйте.

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

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

Необходимо:
< заменить на &lt;
> заменить на &gt;
В начало вставить <list><item>
В конец вставить </item></list>


Один из примеров
<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>
Вот что должно получиться после преобразования


<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
На 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
Да, пожалуй bat не подойдёт, это ведь html файл и символов будет большое разнообразие.

aggressor_
29-05-2012, 13:23
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
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
Да,понятно.
А в какую строку можно добавить удаление использованного файла?
del "C:\1\test\filiali1.txt"
del "C:\1\test_2\perevod1.txt"

и т.д.

Anonymоus
29-05-2012, 14:18
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
из-за EnableDelayedExpansion в обрабатываемом тексте исчезнут все восклицательные знаки. »
Я хотел бы уточнить, будут только восклицательные знаки удаляться или ещё какие-нибудь символы?

Anonymоus
29-05-2012, 15:03
Исключительно восклицательные знаки, остальные символы, с которыми обычно в bat проблемы ('&', '|', etc.) можете использовать без опасений.

aggressor_
29-05-2012, 15:06
Спасибо за помощь!




© OSzone.net 2001-2012