Помощь новичкам

В файле 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. Спс

1:

Только через полноценные риадеры, потому что иначе дурак всегда найдёт что сломать.

2:

А тут можно сделать более простую проверку.

3:

Если знаете где они могут возникнуть - можно костылизировать локально. Если не знаете - опять же через полноценные XMLReader-ы.

Сергей, а какие проблемы вы видите намётанным глазом с концепцией и кодом, как бы правильнее решили? Суть в том, что если подход или идея не оптимальна, то даже самая идеальная реализация не в счёт. Эх

Ну, качество идеи из кода не понять)) Ну, если уже делать руками - я бы вообще взял исходный текст и в нём искал строку <seg>. Хотя, конечно, проверка ошибок сохранения тогда нулевая. Ну в общем как я и сказал - всё зависит от того что вам надо, какие условия (будет ли известно что исходный текст не сломан).

Имеется

var d:=new SortedSet<string>;

Как правильно хеш сохранить в текстовый файл?

 WriteAllLines('e:\dox\unique.txt',d.ToArray());

Не работает.

Также интересует как лучше преобразовать дату и время в формат вида

Спс

Опять не хотите банально заглянуть в Справку. Ясно же видно даже в подсказке 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.
2 лайка

Алекс, благодарю. Хотя пример взял из c# и переделал под свои нужды – именно через WriteAllLines(file_name’,d.ToArray()) для HashSet, однако.

Видите ли, уже устали повторять, что PascalABC.NET - это не C# и никогда им не станет.

Да это понятно и не суть, но вот почему не получается загнать HashSet построчно в текстовый файл через метод ToArray? Явно что-то упускаю из виду.

С другой стороны foreach var ss in d do Writeln(f2,ss) пашет без проблем)

Метод 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.
1 лайк

Подозреваю, что можно и еще замороченнее написать )))

Зато этот вариант легче расширять, можно так сразу много объектов запихнуть в файл.

Хотел сделать навесок GUI, чтобы было удобнее выбирать несколько файлов (желательно с драг-н-дроп), но пока не разобрался какой элемент или контейнер подходит и как преобразовывать в список элементов, чтобы обрабатывать с путями в цикле for/foreach. Может, есть подсказка или даже пример?

Спс

Через это можно. Я тоже как то пытался разобраться, но мне выдаёт System.InvalidOperationException: Регистрация DragDrop невозможна. При запуске формы. Если сможете разобраться - напишите).

1 лайк

Сергей, если у вас Студия, то говорят, что проблема при запуске оной под админом, так как пользовательский проводник не контачит

Не вдаваясь в дебри ТТХ, дизайна ПО и переосмысление концепций, есть ли хотя бы общие рекомендации переделки консольных программ без интерфейса в приложения с GUI?

Нет, я это в паскале, в его же редакторе делал.

Кхм, не думал пока сильно об этом. Приведите пример, что ли…

Как можно сдеать чтоб у .exe была кастомная иконка? Вроде надо эту иконку подключить вроде ресурса, но это ведь не всё?

Например, как оптимально сделать визуальный (Forms/WPF) ввод строки или контролируемого диапазона, выбор файла через OpenFileDialog и SaveFileDialog, счётчики, через что следует отображать динамический массив и другие эквиваленты консольных конструкций.

Столкнулся с тем, что племянник потратил около часа лишь на “визуализацию” простейшего решения квадратного уравнения (его смутил даже вид |±a| x2 |±b| x |±c| = 0 с выносом текстбоксов и меток), а на мой вопрос отнекался, мол изначально писал код не учитывая такие нюансы, а их не учили чем заменять и это не всегда понятно как оптимальнее. И, действительно, моменты проскакивают… За то он хоть результатом доволен и графики понравилось строить)

То про что вы писали в первом абзаце - это на текстбоксы (в основном рич боксы) заменять, + выпадающие списки.

Конечно, любой красивый графический интерфейс отнимает уйму времени. Это всегда так. Или быстро или красиво. Хотя больше часа - это скорее из за маленького опыта. Именно это я бы мин за 5-10 сделал. А в консольном приложении - мин за 1-2.