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

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

Автор Тема: Парсинг текстового файла  (Прочитано 2325 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 254
    • Просмотр профиля
Парсинг текстового файла
« : 12 Июля 2018, 16:33:31 »
Добрый день, разработчики!
Суть проблемы следующая. Есть метеостанция. Собирает данные и записывает в файл. Вид записей в прикрепленном файле.
Заказчик попросил внести некоторые параметры (скорость ветра, температуру и давление) в скаду.
Структура файла не меняется. Пишется все раз в минуту.
Решение.
Открыть файл.
Дойти до конца файла.
Считать строку.
С помощью команд работы со строкой выйти на позицию и скопировать определенное количество символов.
Преобразовать в нужный формат.
Присвоить переменной в скаде преобразованное значение.
Закрыть файл.
Вопросы.
1. Строка скрипта outhum.Value := StrToFloat(UTF8ToString(UTF8Copy (aReadStr, 16, 4))); вычитывает и преобразует значение если в текстовом файле в строке на поз.16 стоит значение допустим 12.3 согласно команде. Если значение равно 8 или 1.9 или --- (нет значения) на сервере выводиться ошибка
"Необработанная ошибка в скрипте "button" в строке 30. '1.9   ' is not a valid floating point value"
и скрипт как я понимаю дальше не работает (исходя из моих экспериментов). Может быть подскажите решение ибо голову сломал. Думаю сделать доп.проверку уже самого скопированного куска.
2. На форуме ища инфу нашел тему с организацией таймера. С учетом того, что в скаде есть скрипты на 1 сек и 1 час может быть приведете пример или ссылку (не могу найти) как организовать скрипт, который будет срабатывать например каждые 5 минут.
Жду Ваших ответов или вопросов.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Парсинг текстового файла
« Ответ #1 : 13 Июля 2018, 06:59:32 »
Серега,
символ <TAB>, используемый в Вашем файле как разделитель полей, является недопустимым для  функции StrToFloat.
Примеры некорректных последовательнстей из ровно 4-х  символов:
Код
			Temp	Hi	Low	Out	Dew	
Date Time Out Temp Temp Hum Pt.
09.07.18 14:24 23.2 23.2 23.2 [u]54 1[/u]3.3 54<TAB>1 табулятор + цифра из следующего поля
...
09.07.18 14:45 [u]1.9 [/u]22.8 1.9<TAB> табулятор

Скрипт, преобразующий строку до первого разделителя <TAB> в вещественное число:
Код: (delphi)
var
  S: UTF8string;
  i: integer;
begin
  S := aStr.AsUTF8String;

  for i := 1 to UTF8Length(S) do
    if S[i] = #9 then                          // поиск разделителя ( =табулятор)
      begin UTF8Delete(S, i, 10); break; end;  // удаление лишнего и выход из цикла

  try
    aVal.Value := StrToFloat(UTF8ToString(S)); // преобразование в вещественное
    Text1.Text := FloatToStr(aVal.Value, 2);
  except                                       // исключение: ошибка прееобразования
    Text1.Text := 'Это не число';
  end;
end.

Замечание. При вводе с клавиатуры символ <TAB> заменяется на ...
Ввод осуществляется копированием-вставкой из исходного файла, открытого в Блокноте. В поле ввода он не отображается.

Пример во вложении.
« Изменён: 20 Июля 2018, 11:42:16 от Simple-Scada »

Серега

  • Старожил
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Парсинг текстового файла
« Ответ #2 : 13 Июля 2018, 12:18:51 »
pan2000
Спасибо за ответ. В принципе пришел практически к такому же решению. Только вместо #9 использовал #$9. Вот только разница в чем пока не разобрался. И так и так работает.
Буду мучить таймер.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Re: Парсинг текстового файла
« Ответ #3 : 13 Июля 2018, 13:21:30 »
Здравствуйте.
Цитировать
На форуме ища инфу нашел тему с организацией таймера. С учетом того, что в скаде есть скрипты на 1 сек и 1 час может быть приведете пример или ссылку (не могу найти) как организовать скрипт, который будет срабатывать например каждые 5 минут.
Скрипт с типом события "Прошла секунда":
Код: (delphi)
const 
  INTERVAL = 300;  // интервал таймера 300 сек. (5 минут)
var
  aCounter: Integer;
begin
  aCounter := aCounter + 1;
  if aCounter >= INTERVAL then
  begin
    // ...код расположенный здесь будет выполняться с интервалом INTERVAL секунд

    aCounter := 0;
  end;
end.

Серега

  • Старожил
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Парсинг текстового файла
« Ответ #4 : 13 Июля 2018, 15:28:15 »
Как все просто. Про этот вариант вообще не подумал. Спасибо!
Тема закрыта.