Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Чтение из CSV-файла  (Прочитано 1482 раз)

vts

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Чтение из CSV-файла
« : 20 Февраля 2021, 22:07:13 »
Прошу помощи у профессионалов. Необходимо вывести в поле переменной, цифру из CSV-файла.
CSV-файл выглядит таким образом:   0R0,Dm=184D,Sm=2.4M,Ta=-12.9C,Tp=-12.2C,Ua=78.8P,Pa=1009.6H.
Значения цифр меняются каждые 5 минут.
Не мог ли кто либо, написать пример, как распарсить и вывести в поле хотя бы одну цифру расположенную между разделителями ,    ,.
Читал весь форум, но я блин ни разу не  программист.  :(. Скомпилировать скрипт за неделю так и не удалось. Выводить значения можно и в таблицу но мне кажется что для поля, скрипт будет проще.
Покажите пожалуйста пример скрипта для такого CSV-файла.

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Чтение из CSV-файла
« Ответ #1 : 22 Февраля 2021, 16:42:22 »
    Здравствуйте.

Строка для разбора:
0R0,Dm=184D,Sm=2.4M,Ta=-12.9C,Tp=-12.2C,Ua=78.8P,Pa=1009.6H.
- не ясно что делать с 0R0;
- принадлежность завершающей "точки" к строке (да, нет);
- левый ограничитель подстроки значения - уникальный ключ в формате "<имя ключа>=";
- правый ограничитель - единица измерения в формате "<ед.изм.>," или "<ед.изм.>." (последняя пара) или "<ед.изм.>" (можно обойтись без "запятой")
Для удобства можно связать ограничители с непосредственно с переменной: левый как "Описание" переменной, правый - "Единица измерения" шкалы.
Например для ключа "Ta": "Описание" - "Ta=", "Единица измерения" - "C," или "C".
Для переменной, связанной с полем как основная и разбираемой строкой как дополнительная скрипт по изменению доп. переменной:
Код: (delphi)
var aStr: UTF8String;
    i: integer;
begin
  with Sender as TM_Field do begin
    i := StrPos(UTF8ToString(Variable.Description), VariableEx.AsStr);  // позиция ключа (левого ограничителя)
    if i = 0 then exit;                                                 // ОШИБКА: ключ не найден
    aStr := UTF8Copy(VariableEx.AsUTF8String, i + UTF8Length(Variable.Description), 200); // урезать строку до начала значения (200 - макс. длина подстроки значения !!!)
    i := StrPos(UTF8ToString(Variable.Units), UTF8ToString(aStr));      // позиция завершения подстроки значения (правого ограничителя)
    if i = 0 then exit;                                                 // ОШИБКА: завершение не найдено
    Value := StrToFloatDef(UTF8ToString(UTF8Copy(aStr,1, i - 1)), -999999); // значение из строки или по-умолчанию
  end;
end.
Если нет необходимости привязки переменных к полям (заполнение таблицы), скрипт можно переписать как процедуру или функцию (с двумя параметрами типа TM_Variable) в составе скрипта по изменению строки разбора, где собственно в скрипте организуется цикл (для таблицы) или перебор (произвольный набор переменных) вызовов функции/процедуры по всем переменным.
Во вложении пример (необходимо пересохранить) для набора полей и таблицы. Выпадающий список позволяет выбрать строку, в т.ч. и с ошибками. Можно вносить изменения в разбираемую строку и увидеть результат в полях и таблице.

vts

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Чтение из CSV-файла
« Ответ #2 : 23 Февраля 2021, 00:35:21 »
pan2000 Спасибо громадное. Информации для не программиста много, надо переварить. После праздников
буду пробовать парсить. Еще раз спасибо. ;D