В файле TMX (xml) содержится двуязычный глоссарий/накопительная база, откуда я брутфорсно вырезаю сегменты (строки или фрагменты строк) между тегами <seg> .. </seg> и попарно сохраняю в табулированный (разделённый TAB’ами - #9) файл.
{$reference System.Xml.dll}
uses System.Xml;
begin
var doc := new XmlDocument();
doc.Load('e:\dox\this.tmx');
//var root := doc.DocumentElement;
var elemList := doc.GetElementsByTagName('seg');
//список значений между тегами <seg>..</seg>
var f:=OpenWrite('e:\dox\_this.txt'); //выходной файл
var _dt:='20180505~050505'+#9+'AZ'+#9+'0'+#9+'EN'+#9;
//хотел честно читать дату в тегах или конвертировать текущую,
//а также язык и имя пользователя, но упростил для шаблона
var s:string; //заготовка для записи строки в файл
var i:cardinal=0; //счётчик списка
while i<elemList.Count do begin //основной цикл
s:=_dt+elemList[i].InnerXml+#9+'RU'+#9+elemList[i+1].InnerXml;
Writeln(f,s);
i+=2; //шаг
end;//while
f.Close;
end.
Не разобрался как проверить тип XML и как читать последовательно по узлах, так что код далеко не лучший, тем более, что есть варианты с XMLReader и прочими нюансами (от Linq до RegEx), но какое считается самое оптимальное (скорость/память) и рекомендуемое (контролируемое) решение? В общем, как правильно работать с XML в PABC.NET? Например, есть ли способ или алгоритм, чтобы перестраховаться от дураков, неправильного типа, сбоя или переполнения памяти?
А то возможности вроде шикарные, а не знаешь что да как, и всё сводится к банальному выкусыванию как в BP/TP.
Спс
Сергей, а какие проблемы вы видите намётанным глазом с концепцией и кодом, как бы правильнее решили? Суть в том, что если подход или идея не оптимальна, то даже самая идеальная реализация не в счёт. Эх
Ну, качество идеи из кода не понять)) Ну, если уже делать руками - я бы вообще взял исходный текст и в нём искал строку <seg>. Хотя, конечно, проверка ошибок сохранения тогда нулевая. Ну в общем как я и сказал - всё зависит от того что вам надо, какие условия (будет ли известно что исходный текст не сломан).
Опять не хотите банально заглянуть в Справку. Ясно же видно даже в подсказке Intellisence: требуется указать строку, а не SortedSet.
begin
var d:=new SortedSet<string>;
d:='А роза упала на лапу Азора'.ToWords.ToSortedSet;
d.Println('|');
WriteAllText('e:\dox\unique.txt',d.JoinIntoString)
end.
begin
var Ы := DateTime.Now;
Println(Ы);
var s := $'{Ы:yyyyMMdd~HHmmss}';
s.Println
end.
Метод ToArray - преобразование в массив. Какое отношение он имеет к записи в файл?
Присвойте результат .ToArray переменной, выведите ее по Writeln и посмотрите, что и как попадает в этот массив. А потом посмотрите, что требует формат записи того средства, которым вы пытаетесь в файл поместить данные.
begin
var d:=new SortedSet<string>;
d:='А роза упала на лапу Азора'.ToWords.ToSortedSet;
var bs := new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter;
var str := System.IO.File.Create('temp.txt');
bs.Serialize(str,d);
str.Close;
str := System.IO.File.OpenRead('temp.txt');
var d2:SortedSet<string> := SortedSet&<string>(bs.Deserialize(str));
str.Close;
d.PrintLines;
writeln('-'*50);
d2.PrintLines;
end.
Хотел сделать навесок GUI, чтобы было удобнее выбирать несколько файлов (желательно с драг-н-дроп), но пока не разобрался какой элемент или контейнер подходит и как преобразовывать в список элементов, чтобы обрабатывать с путями в цикле for/foreach. Может, есть подсказка или даже пример?
Через это можно. Я тоже как то пытался разобраться, но мне выдаёт System.InvalidOperationException: Регистрация DragDrop невозможна. При запуске формы. Если сможете разобраться - напишите).
Сергей, если у вас Студия, то говорят, что проблема при запуске оной под админом, так как пользовательский проводник не контачит
Не вдаваясь в дебри ТТХ, дизайна ПО и переосмысление концепций, есть ли хотя бы общие рекомендации переделки консольных программ без интерфейса в приложения с GUI?
Например, как оптимально сделать визуальный (Forms/WPF) ввод строки или контролируемого диапазона, выбор файла через OpenFileDialog и SaveFileDialog, счётчики, через что следует отображать динамический массив и другие эквиваленты консольных конструкций.
Столкнулся с тем, что племянник потратил около часа лишь на “визуализацию” простейшего решения квадратного уравнения (его смутил даже вид |±a| x2 |±b| x |±c| = 0 с выносом текстбоксов и меток), а на мой вопрос отнекался, мол изначально писал код не учитывая такие нюансы, а их не учили чем заменять и это не всегда понятно как оптимальнее. И, действительно, моменты проскакивают… За то он хоть результатом доволен и графики понравилось строить)
То про что вы писали в первом абзаце - это на текстбоксы (в основном рич боксы) заменять, + выпадающие списки.
Конечно, любой красивый графический интерфейс отнимает уйму времени. Это всегда так. Или быстро или красиво. Хотя больше часа - это скорее из за маленького опыта. Именно это я бы мин за 5-10 сделал. А в консольном приложении - мин за 1-2.