Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Zagzag228
Добрый день. Шикарный чат, с отличным скриптовым движком. Очень удобная штука со "считыванием" с файла.
А у меня такой вопрос, как сделать это же, тока чтобы по определенной команде Элизе (например !данные) Элиза выдавала список 20 последних строк из таблицы Excel (Excel файлик из 8 столбиков и 1000 строк.) ???
Пример таблицы могу приложить. :?:
Аватара пользователя
Алексей Пикуров
День добрый. Если вы сможете достать данные из MS Excel файла - то без проблем.

Как их вычитать оттуда? Дайте файлик, подумаем.

P.S. Тема отделена.
Zagzag228
Вот файл, данных много, нужно, чтобы всегда по команде можно было последние 20 строк отобразить.
Такой скрипт 100% многим пригодиться в корпоративных чатах, для статистики и т.д.
Жду вашей помощи.
Вложения
(66.6 КБ) Скачиваний: 215
Аватара пользователя
Алексей Пикуров
Сделайте экспорт вашего файла в CSV текстовый формат, чтобы с native XLSX не мучиться. И вычитывайте скриптом уже текстовый файл, там всё элементарно. Попробуйте.
Аватара пользователя
Алексей Пикуров
P.S. Ну, или если уж совсем никак самому, или есть какие-то проблемы с конвертацией - то можем сделать скрипт+доп.обвесок для вычитки из Excel-файла для вас на заказ.
Zagzag228
Да нам не принципиально, пусть будут и в CSV файле храниться, как сделать, чтобы по команде выдавало только последние 20 из списка CSV?
Аватара пользователя
Алексей Пикуров
Ок, погодите немного, сейчас вам скрипт рожу :) Только, чур - "допиливать под себя" уже сами.
Аватара пользователя
Алексей Пикуров
День добрый.

Скрипт готов. Итак, исходный файл в формате CSV должен выглядеть так (по вашему примеру, несколько строк из вашего файла):
Код: Выделить всё
п/п; подпись;участник;Список доп номера;порядковый;число;положение;примечание;СЧЕТ №; Сумма по счету ;
29;Егоров;Саша;241000029;124144662;;ДА;;;;
30;Егоров;Саша;241000030;124144663;;ДА;;593 от 01.11.10; 10 000,00р. ;
31;Петров;Николай;241000031;124144664;;ДА;;;;
32;Егоров;Пётр;241000032;124144665;;ДА;;592 от 01.11.10; 6 000,00р. ;

Скрипт "слушает", что скажут роботу-Элизе в привате, и, если это команда "!данные", то вычитывает заданное количество строк из файла D:\data.csv (местоположение может быть любым, настраивается константой в скрипте).

Если ввести, например "!данные 10" - то прочитается последние 10 строк. Если цифру не указать - читаются последние 20. Количество можно настроить в скрипте. Регистр команды не важен, можно написать большими и маленькими буквами.

Выглядит в результате это так в интерфейсе MyChat Client:
lastrecords.png
Результат работы скрипта вычитки данных из CSV Excel файла в чат MyChat

А вот сервер со скриптом, обратите внимание, в какое событие необходимо записать скрипт:
lastrecordsscriptsource.png
Исходный текст скрипта вычитки последних строк из CSV файла для корпоративного мессенджера MyChat

Ну и собственно сам исходник скрипта:
Код: Выделить всё
const
  sFile = 'D:\data.csv';
  nTitles = 10;
 
var
  iUINFrom, iUINTo, iCountLastMessages: integer;
  sMsg: string;

function GetLastLinesFromFile(sFileName: string; nLines: integer): string;
var
  sOut, s, sBackup: string;
  i, j, iCount: integer;
  sTitles: array[1..nTitles] of string;
begin
  iCount := GetTextFileLinesCount(sFileName);
 
    if iCount >= nLines then begin
      sOut := 'Последние ' + IntToStr(nLines) + ' записей:' + CRLF;
      LoadLineFromFile(sFileName, 1, s);
     
        for i := 1 to nTitles do sTitles[i] := Trim(GetNextSt(s, ';'));
     
        for i := iCount - nLines + 1 to iCount do begin
          if LoadLineFromFile(sFileName, i, s) then begin
            for j := 1 to nTitles do sOut := sOut + sTitles[j] + ': ' + Trim(GetNextSt(s, ';')) + ';'; 

            sOut := sOut + CRLF;
          end; 
        end;
    end else sOut := ''; 
 
  result := sOut;
end;
 
begin
  sMsg := mGetLastPrivateMessage(iUINFrom, iUINTo);
 
    if iUINTo = 0 then 
      if Trim(UpperCase(GetNextSt(sMsg, ' '))) = '!ДАННЫЕ' then begin
        if sMsg = '' then iCountLastMessages := 20
          else if isSTNumbers(sMsg) then iCountLastMessages := StrToInt(sMsg)
            else iCountLastMessages := 20;
           
        sMsg := GetLastLinesFromFile(sFile, iCountLastMessages);
       
        mModifyLastPrivateMessage(iUINFrom, 0, '');
       
        mSendPrivateMessage(iUINFrom, sMsg);
      end;
end.
Zagzag228
Шикарно!! Огромное спасибо, никак не нарадуемся покупке) :)
Аватара пользователя
Алексей Пикуров
В новой версии MyChat скриптовая функция mSendPrivateMessage была изменена, пожалуйста, учтите это и переделайте свои скрипты.

Справка