PDA

Показать полную графическую версию : Копирование строки с условием


Zoidman
14-10-2022, 10:15
Приветствую!
Возможно создать скрипт, при запуске которого сканировалась каждая строка файла xml или txt и если в строке есть определенная часть (например <text> или <desc>), то скопировать данную строку целиком в отдельный фаил. Если в строке данной части нет, то сделать отступ. Желательно запускать .BAT или подсказать, как можно запускать решение. Возможно такое? Фаил и пример https://ibb.co/mXTQhrB

Zoidman
14-10-2022, 12:33
или же наоборот, удалить все записи в строке (сделать ее пустой) если в тексте нет <text> или <desc>. Так наверно будет попроще

DJ Mogarych
14-10-2022, 15:22
Выкладывать текстовый пример как картинку - это круто, но не могли бы вы выложить всё-таки текст?

Zoidman
14-10-2022, 16:11
Прикрепляю файл и пример

YuS_2
14-10-2022, 17:01
Zoidman, если есть желание получить помощь, то необходимо описать задачу полностью, причем с полными примерами (если есть конфиденциальная информация, то её можно изменить), а не вырезанные части файла ... Возможно, способ, которым Вы желаете её решить, не является правильным и тогда, опять же, возможно, Вам подскажут как её лучше решить...

DJ Mogarych
14-10-2022, 18:19
"Батник"

powershell -command "(gc C:\temp\1.txt |% {if ($_ -match '<(name|desc)>') {$_ -replace '</?(name|desc)>'} else {$_ -replace '.*'}}) > C:\temp\2.txt"

YuS_2
14-10-2022, 18:46
DJ Mogarych, это хоть и обрезанный, но xml же... в нем понятие "строка" весьма условно. Надо работать с тегами...

DJ Mogarych
14-10-2022, 19:12
YuS_2, это должен сначала понять автор темы. Пока это ему не нужно.

Zoidman
14-10-2022, 19:19
Прикладываю изначальный фаил. Я бы хотел вытащить английский текст для перевода (таких файлов много) и у них разные рамки, встречаются <tooltip>, <type> и тд. хотел самый простой вариант, который позволит задать свои теги под каждый фаил. После заменить измененные строки (через excel меняется легко)

DJ Mogarych
14-10-2022, 20:57
Этот XML неканоничный, у него отсутствует корневой элемент, нормально импортируется в Powershell только если добавить тэг:


<?xml version="1.0" encoding="UTF-8"?>
<foo>
<achievement id="ACH_SECTOR_5">
<name>Just Getting Started</name>
<desc>Get to sector 5.</desc>
<img>achievements/0.png</img>
<multiDifficulty>1</multiDifficulty>
</achievement>
<achievement id="ACH_LANIUS_OXYGEN">
<name>Loss of Cabin Pressure</name>
<desc>Get to sector 8 without your ship's net oxygen levels exceeding 20 percent (starts after the first jump).</desc>
<img>achievements/anaerobic_cruiser_3.png</img>
<ship>PLAYER_SHIP_ANAEROBIC</ship>
<multiDifficulty>1</multiDifficulty>
</achievement>
</foo>


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

Есть варианты менее кривые: связаться с разработчиками и предложить им перевод, может, у них есть нормальный инструмент для локализации. Либо существует какая-то сторонняя программа для перевода.

Zoidman
14-10-2022, 22:51
жаль, я хотел знакомому оптимальный вариант скинуть, что бы у него проблем не было.

YuS_2
15-10-2022, 08:32
вытащить английский текст для перевода (таких файлов много) »
Это можно сделать, но DJ Mogarych, правильно выше сказал, придется заморочиться с добавлением корневого тега в каждый файл, ибо это не валидные xml. И даже это не очень большая проблема, можно автоматизировать добавление тегов, но при условии, что структура всех файлов одинаковая.

YuS_2
15-10-2022, 11:59
хотел знакомому оптимальный вариант скинуть »
Про условия - ничего не изменилось...
В первом приближении:
Powershell:
Добавление тегов:
script_addtag.ps1
param (
$path = '.\TEST',
$flt = '*.xml',
$enc = 'utf8'
)
dir $path -filter $flt -file|%{
$tmp = $_.fullname
if (($text = (gc $tmp -enc $enc -raw)) -notmatch '<root>'){
$text = $text -replace '(<\?xml version="1\.0" encoding="UTF-8"\?>)',"`$1`r`n<root>"`
-replace '([^\r\n][\r\n]*)$',"`$1`r`n</root>"
$text |out-file $tmp -enc $enc
}
}

Собственно, получение CSV-файла с данными:
script.ps1
param (
$path = '.\TEST',
$filter = '*.xml',
$par1 = 'name',
$par2 = 'desc',
$par3,
$par4,
$enc = 'utf8',
$out = '.\out.csv'
)
function custom-obj ($f,$id,$k,$l,$m,$n) {
[pscustomobject]@{
'FILE' = $f
'ACHIEVE_ID' = $id
'PARAM_1' = if ($k){$k} else {'NULL'}
'PARAM_2' = if ($l){$l} else {'NULL'}
'PARAM_3' = if ($m){$m} else {'NULL'}
'PARAM_4' = if ($n){$n} else {'NULL'}
}
}

$arr = dir $path -filter $filter -file|%{
$file = $_.name
[xml]$xml = gc $_.fullname -enc $enc
$xml.selectnodes("//achievement") |%{
custom-obj $file $_.id $_.$par1 $_.$par2 $_.$par3 $_.$par4
}
}
$arr| convertto-csv |out-file $out -enc $enc

Путь к каталогу с XML-файлами можно указать и абсолютный.
Скрипты можно запускать с параметрами. Например:
.\script_addtag.ps1 -path 'D:\XML'
.\script.ps1 -path 'D:\XML' -filter '*.xml' -par1 'name' -par2 'desc' -par3 'tooltip' -par4 'type'




© OSzone.net 2001-2012