|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Сложная замена текста в файле |
|
|
Любой язык - Сложная замена текста в файле
|
Новый участник Сообщения: 6 |
имеется файл 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
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Скрытый текст
<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
|
Профиль | Отправить PM | Цитировать niverprof, в xml нет таких понятий как «параметр», «столбец» и т.п. Есть понятия «корень», «узел», «атрибут», «значение атрибута».
Перевести на русский выражение «Вначале xml создает» не смог вовсе. Сожалею. |
Отправлено: 14:16, 19-12-2014 | #4 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Элемент <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
|
Профиль | Отправить PM | Цитировать niverprof, это уже сделано в скрипте выше на PowerShell.
Непонятна вторая часть, со слов: Цитата niverprof:
|
|
Отправлено: 15:39, 19-12-2014 | #6 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Цитата Iska:
а вот <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
|
Профиль | Отправить PM | Цитировать niverprof, ага, начинаю теперь понимать связь, на свежую голову… Попробую изобразить.
|
Отправлено: 09:48, 20-12-2014 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|