Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт для замены текста в файлах

Ответить
Настройки темы
Любой язык - [решено] Скрипт для замены текста в файлах

Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ищу решение - как лучше реализовать замену определенного текста в текстовом файле?
Файлы примерно по 5мб, разных пар текста для замены будет порядка 100 штук. То есть в каждом файле организовывается поиск примерно 100 различных тестовых фраз и , в случае их наличия, эти фразы заменяются на определенных другие текстовые фразы.
Реально ли данную задачу реализовать через командную строку? Какие варианты предложите?

Отправлено: 05:04, 17-06-2019

 

Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


Попробуйте. Это решение именно для этой структуры Вашего файла
Код: Выделить весь код
@Echo Off
cls
	SetLocal EnableExtensions,EnableDelayedExpansion 
	CHCP 1251 >nul

	Set  "BoxIn=Z:\Box_In"
	Set "BoxOut=Z:\Box_Out"
	Set "BoxArc=Z:\Box_Arc"

	Set "Mask=incoming*.txt"

	2>nul Md "%BoxOut%"
	2>nul Md "%BoxArc%"

	Call :Replacement

	FOR %%f IN ("%BoxIn%\%Mask%") DO (
		Echo ========= "%%f"
		>"%BoxOut%\%%~nxf" (FOR /F "usebackq tokens=1,2,3,4,5,6,7,8,9,10 delims=;=" %%i IN ("%%f") DO (
			Set "ssl=%%l"
			Set "ssn=%%n"

			Call :Substitute "ssl" "%%%%l%%"
			Call :Substitute "ssn" "%%%%n%%"
			Echo %%i=%%j;%%k=!ssl!;%%m=!ssn!;%%o=%%p;%%q=%%r;
		))
		Move /Y "%%f" "%BoxArc%\"
	)
	EndLocal
pause
Exit /B

:Substitute
	If Not "%~2"=="" Set "%~1=%~2"
Exit /B

:Replacement

Set "voronez=Воронеж"
Set "tver=Тверь"
Set "rostov=Ростов"
Set "sochi=Сочи"

Exit /B

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


Последний раз редактировалось megaloman, 17-06-2019 в 17:06.


Отправлено: 16:59, 17-06-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:10, 17-06-2019 | #12


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


Цитата Stolc:
Не работает скрипт - пишет "для продолжения нажмите кнопку" и закрывается »
А в инбоксе файлы есть? Может, они уже в архиве после предыдущего скрипта? А файлы отображаются при работе скрипта? А в аутбокс файлы попадают? А кодировка какая? А пары для замены Вы переделали для нового формата этого батника?

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


Отправлено: 17:17, 17-06-2019 | #13


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Да, пары переделал. В InBox файлы есть. Кодировка 1251. В OutBox не попадают файлы.

Отправлено: 17:21, 17-06-2019 | #14


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


Цитата megaloman:
А файлы отображаются при работе скрипта? »
Переименуйте ваш батник в txt-файл, предоставьте, и неплохо бы заархивировать реальный файл и приложить к сообщению, или фрагмент файла. Структура файла именно такая, или там еще какие-то заголовки присутствуют?

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


Последний раз редактировалось megaloman, 17-06-2019 в 17:32.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:23, 17-06-2019 | #15


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Беру паузу до завтра. Попробую разобраться позже. Спасибо за помощь!

Отправлено: 17:31, 17-06-2019 | #16


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


В общем, попробовал через vbs-скрипт сделать замену в файлах. Все работает на ура.

Создал файл replace.vbs

PHP код: Выделить весь код

Const ForReading 1    

Const ForWriting 2
strFileName 
Wscript.Arguments(0)
Set objFSO CreateObject("Scripting.FileSystemObject")
Set objFile objFSO.OpenTextFile(strFileNameForReading)
strText objFile.ReadAll
objFile
.Close

strText 
Replace(strText"voronez" "Воронеж")
strText Replace(strText"tver" "Тверь")
strText Replace(strText"sochi" "Сочи")

Set objFile objFSO.OpenTextFile(strFileNameForWriting)
objFile.Write strText  'WriteLine adds extra CR/LF
objFile.Close 

и через bat-файл запускаю его, указав в качестве параметра имя файла.

Отправлено: 12:27, 18-06-2019 | #17


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


Цитата Stolc:
Будет папка IN, в эту папку попадают файлы для обработки. После обработки файлы попадают в папку OUT.»
Ваш скрипт это не делает.
Вот вариант. Обрабатываются все файлы в инбоксе, обработанные идут в аутбокс, исходный перемещается в архив.
Это чистый vbs, CMD не задействован

Код: Выделить весь код
BoxIn = "Z:\Box_In"
BoxOut = "Z:\Box_Out"
BoxArc = "Z:\Box_Arc"

RegExp = "incoming.*\.txt"

Mre = Array("voronez", "Воронеж", _
            "tver", "Тверь", _
            "rostov", "Ростов", _
            "sochi", "Сочи", _
            "moskva", "Москва", _
            "orel", "Орел")

Set Mask = CreateObject("VBScript.RegExp")
Mask.Pattern = RegExp
Mask.IgnoreCase = True
Mask.Global = True
            
j = 0
With CreateObject("Scripting.FileSystemObject")
    Set Fold = .GetFolder(BoxIn)
    Set Files = Fold.Files

    For Each iFile In Files       ' Цикл по файлам в папке (как вариант решения)
        If Mask.Test(iFile.Name) Then
            Set Fin = .OpenTextFile(iFile, 1, False)
            Text = Fin.ReadAll
            Fin.Close
            
            For i = LBound(Mre) To UBound(Mre) Step 2
                Text = Replace(Text, Mre(i), Mre(i + 1))
            Next
            
            Set Fout = .OpenTextFile(BoxOut + "\" + iFile.Name, 2, True)
            Fout.Write Text
            Fout.Close
            
            If .FileExists(BoxArc + "\" + iFile.Name) Then .DeleteFile BoxArc + "\" + iFile.Name, True
            .MoveFile iFile, BoxArc + "\"
            j = j + 1
        End If
    Next
End With
MsgBox "Обработано " + CStr(j) + " файлов"
Мой второй CMD работает на порядок быстрее, чем первый, однако vbs работает мигом.

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:12, 18-06-2019 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт для замены текста в файлах

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
TextReplace - Программа для поиска и замены текста в любых файлах AZJIO AutoIt 6 02-02-2018 20:56
Любой язык - скрипт для замены текста в файле batyaPS Скриптовые языки администрирования Windows 19 10-01-2015 06:27
Любой язык - Скрипт для замены Kira1 Скриптовые языки администрирования Windows 2 15-07-2013 18:39
2003/XP/2000 - Макрос Excel для преобразования колонки текста в число в dbf файлах aRHangel2013 Microsoft Office (Word, Excel, Outlook и т.д.) 8 11-01-2013 17:07
C/C++ - Поиск текста в файлах student_po Программирование и базы данных 6 04-09-2009 23:33




 
Переход