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

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

Ответить
Настройки темы
Любой язык - Сложная замена текста в файле

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


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

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


Вложения
Тип файла: xml archive_dbf.xml
(20.5 Kb, 8 просмотров)
имеется файл archive_dbf.xml в нем в одну строку записаны данные, нужно найти FRM_REFL="тут 16 чисел указанных через ;" и заменить на R_400="превое число" R_420="второе число" ...... R_700="шестнадцатое число" шаг между R +20, причем после этого поиск продолжится пока снова не встретится FRM_REFL с уже новыми значениями которые тоже нужно заменить и так до конца файла.

P/S/ По сути скрипт должен менять структуру xml и делать из одного параметра FRM_REFL 16 параметров от R_400 до R_700 при этом значения для R_ХХХ берутся из FRM_REFL
В идеале ещё нужно найти <FIELD attrname="FRM_REFL" fieldtype="string.uni" WIDTH="256"/> и заменить <FIELD attrname="R_400" fieldtype="string.uni" WIDTH="256"/><FIELD attrname="R_420" fieldtype="string.uni" WIDTH="256"/> ..... <FIELD attrname="R_700" fieldtype="string.uni" WIDTH="256"/>

Файл прикладываю.

Отправлено: 06:37, 19-12-2014

 

Ветеран


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

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


PowerShell:
Скрытый текст
Код: Выделить весь код
$sSourceFile = "C:\Песочница\058\archive_dbf.xml"

if(Test-Path -Path $sSourceFile -PathType "Leaf") {
    $oXML = [xml](Get-Content $sSourceFile)

    $oXML.DATAPACKET.ROWDATA.ROW |`
        ForEach-Object -Process {
            $oNode = $_
            $aValues = $oNode.FRM_REFL
            
            $oNode.RemoveAttribute("FRM_REFL")
            
            $aValues -split ";" | Where-Object -FilterScript {$_ -ne ""} | `
                ForEach-Object -Begin { $i = 400 } -Process {
                    $oNode.SetAttribute("R_$i", $_)
                    $i += 20
                }
        }
    
    Rename-Item -Path $sSourceFile -NewName "$sSourceFile.bak" -Force
    $oXML.save($sSourceFile)
}


Цитата niverprof:
В идеале »
Не очень понятно. Поясните.

Отправлено: 13:25, 19-12-2014 | #2



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

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


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


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

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


Цитата Iska:
Не очень понятно. Поясните. »
Вначале xml создает столбцы например
Скрытый текст
<FIELD attrname="FRM_REFL" fieldtype="string.uni" WIDTH="256"/> а потом строки например
<ROWDATA><ROW ID=" 184" DATAID="1227253747" PROD_ID=" 1" SUBP_ID=" 1" UNIT="1" FRACTION="1" WEIGHTMODE="FALSE" KEY1="M1019" KEY2="Mekran" KEY3="Ral 1019" BASE_ID=" 1" FILL_QC="0" FILL_WC="0" CAN_ID=" 0" CAN_WEIGHT="FALSE" NOM_Q0="300" FORMULA="1,39.35,2,2.4,4,15.8,6,4.5,10,0.15" PART="0" SUBSTR_ID=" 0" FRM_REFL="14.675;16.731;18.792;20.047;20.389;21.760;24.031;26.392;28.912;31.025;31.398;30.927;30.581 ;30.288;30.246;30.348;" X_02="26.79" Y_02="27.64" Z_02="21.26" X_10="26.57" Y_10="27.12" Z_10="20.74" DATA1="20120521" BAS_WEIGHT="FALSE" BASFILLQ="0" BASFILLW="0" BASSPEC_W="0" CUSCAN_DES="300 ml. - Обычный размер"/>


Так вот если столбцов R_400 ... R_700 не будет создано, то вероятно что и строчки в которых станет на 16 значений больше могут сбится при дальнейшей работе с файлом.

Отправлено: 14:12, 19-12-2014 | #3


Ветеран


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

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


niverprof, в xml нет таких понятий как «параметр», «столбец» и т.п. Есть понятия «корень», «узел», «атрибут», «значение атрибута».

Перевести на русский выражение «Вначале xml создает» не смог вовсе. Сожалею.

Отправлено: 14:16, 19-12-2014 | #4


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


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

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


Цитата Iska:
niverprof, в xml нет таких понятий как «параметр», «столбец» и т.п. Есть понятия «корень», «узел», «атрибут», «значение атрибута».
Перевести на русский выражение «Вначале xml создает» не смог вовсе. Сожалею. »
ОК давайте так. Предложенный XML по сути таблица данных. В ней есть элементы <FIELD>. Каждый элемент <FIELD> описывает содержимое определенного поля данных. Поле может быть сопоставлено только с одним столбцом таблицы. соответственно так как мне необходимо разбить один элемент <FIELD> на шестнадцать нужно например преобразовать элемент <FIELD attrname="FRM_REFL"> в <FIELD attrname="R_400"> и добавить ещё 15 элементов <FIELD attrname="R_420"> ... <FIELD attrname="R_700"> после этого идем дальше.

Элемент <ROW> описывает, как создавать строки данных из файла данных, который импортируется в таблицу. в каждом элементе <ROW> мы заменяем один атрибут FRM_REFL= на шестнадцать атрибутов R_XXX, значения которых берем из FRM_REFL= путем разделения по признаку ;

Надеюсь так стало понятнее. За скрипт огромное спасибо поставил PowerShell разобрался как работает, скрипт отработал на ура все поделилось так как хотел! осталось только создать <FIELD attrname="R_XXX">

Последний раз редактировалось niverprof, 19-12-2014 в 15:44.


Отправлено: 15:21, 19-12-2014 | #5


Ветеран


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

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


niverprof, это уже сделано в скрипте выше на PowerShell.

Непонятна вторая часть, со слов:
Цитата niverprof:
В идеале ещё нужно »
и далее.

Отправлено: 15:39, 19-12-2014 | #6


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


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

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


Цитата Iska:
niverprof, это уже сделано в скрипте выше на PowerShell.
Непонятна вторая часть, со слов:
Цитата niverprof:
В идеале ещё нужно »
и далее. »
Скрипт переделывает только <ROW> с ними действительно все круто, так как надо.

а вот <FIELD> остался без изменений, нужно удалить <FIELD attrname="FRM_REFL" fieldtype="string.uni" WIDTH="256" />
и создать <FIELD attrname="R_$i" fieldtype="string.uni" WIDTH="256" /> где $i = 400 с шагом 20 и концом 700.

Отправлено: 16:01, 19-12-2014 | #7


Ветеран


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

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


niverprof, ага, начинаю теперь понимать связь, на свежую голову… Попробую изобразить.

Отправлено: 09:48, 20-12-2014 | #8


Ветеран


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

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


niverprof, ну, вот, если ничего не забыл — как-то так:
Скрытый текст
Код: Выделить весь код
$sSourceFile = "E:\Песочница\0417\archive_dbf.xml"

if(Test-Path -Path $sSourceFile -PathType "Leaf") {
    $oXML = [xml](Get-Content $sSourceFile)
    
    $oFieldNode = $oXML.SelectSingleNode("/DATAPACKET/METADATA/FIELDS/FIELD[@attrname='FRM_REFL']")
    $oPreviousFieldNode = $oFieldNode.PreviousSibling
    
    $oFieldNode.ParentNode.RemoveChild($oFieldNode) | Out-Null
    
    for($i = 400; $i -le 700; $i += 20) {
        $oPreviousFieldNode = $oPreviousFieldNode.ParentNode.InsertAfter($oXML.CreateNode([System.Xml.XmlNodeType]::Element, "FIELD", ""), $oPreviousFieldNode)
        
        $oPreviousFieldNode.Attributes.Append($oXML.CreateNode([System.Xml.XmlNodeType]::Attribute, "attrname", "")).Value  = "R_$i"
        $oPreviousFieldNode.Attributes.Append($oXML.CreateNode([System.Xml.XmlNodeType]::Attribute, "fieldtype", "")).Value = "string.uni"
        $oPreviousFieldNode.Attributes.Append($oXML.CreateNode([System.Xml.XmlNodeType]::Attribute, "WIDTH", "")).Value     = "256"
    }
    
    $oXML.DATAPACKET.ROWDATA.ROW |`
        ForEach-Object -Process {
            $oRowNode = $_
            $oAttributeNode = $oRowNode.GetAttributeNode("FRM_REFL")
            
            $oAttributeNode.Value -split ";" | Where-Object -FilterScript {$_ -ne ""} | `
                ForEach-Object -Begin {
                    $i = 400
                    $oPreviousAttributeNode = $oAttributeNode
                } -Process {
                    $oPreviousAttributeNode = $oRowNode.Attributes.InsertAfter($oXML.CreateNode([System.Xml.XmlNodeType]::Attribute, "R_$i", ""), $oPreviousAttributeNode)
                    $oPreviousAttributeNode.Value = $_
                    $i += 20
                }
            $oRowNode.RemoveAttributeNode($oAttributeNode) | Out-Null
        }
    
    Remove-Item -Path "$sSourceFile.bak" -Force -ErrorAction SilentlyContinue
    Rename-Item -Path $sSourceFile -NewName "$sSourceFile.bak"
    
    $oXML.save($sSourceFile)
} else {
    Write-Host "Can't find source xml file [$sSourceFile]." -ForegroundColor Red
}

Пробуйте. Проверок соответствия формата никаких.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:33, 22-12-2014 | #9


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


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

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


Цитата Iska:
Пробуйте. Проверок соответствия формата никаких. »
"
Все работает только с русским текстом беда. В исходном файле например в атрибуте "CUSCAN_DES" надпись на русским выглядит как
CUSCAN_DES="500 ml. - & #1054;& #1073;& #1099;& #1095;& #1085;& #1099;& #1081; & #1088;& #1072;& #1079;& #1084;& #1077;& #1088;" а после обработки
CUSCAN_DES="500 ml. - Обычный размер" и при дальнейшем импорте в базу из за кодировки вместо русских букв вопросики ???????
как сделать чтобы обработка выкладывала то что взяла без изменений, или проще кодировку поменять в XML?

Последний раз редактировалось niverprof, 22-12-2014 в 09:46.


Отправлено: 09:40, 22-12-2014 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] замена текста в файле по шаблону dembel_zone Скриптовые языки администрирования Windows 12 29-12-2013 19:21
[решено] Поиск и замена текста в файле TERMINAL AutoIt 6 16-03-2011 17:49
Разное - [решено] FoxPro 2.6 Замена фрагментов текста в txt-файле Pashka Программирование и базы данных 7 18-01-2010 19:20
CMD/BAT - Расположение текста в файле в 2 колонки Serg2010 Скриптовые языки администрирования Windows 6 28-08-2009 18:31
CMD/BAT - [решено] Изменение текста в файле tarasov.evgeny Скриптовые языки администрирования Windows 5 12-08-2009 16:21




 
Переход