Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
s62
Member

Откуда: Жуковский
Сообщений: 988
Док
...
ps. надеюсь #13 и #10 при любой погоде остануться однобайтными Картинка с другого сайта.. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.

Напрасно надеешься :)

К сообщению приложен файл. Размер - 4Kb
4 сен 19, 16:49    [21963679]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
Док
ps. надеюсь #13 и #10 при любой погоде остануться однобайтными Картинка с другого сайта.. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.
вход с консоли останется тот же, однобайтный - тут ничего не поменяется надеюсь
4 сен 19, 16:49    [21963680]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Док
если я правильно тебя понял, все упирается в то, какого типа строка в фпц на момент сборки кода.

Именно. У тебя под буфер для винды используется конкретизированный тип, а для прочих систем дефолтный. Однако, буфер то байтовый.

Кстати, у тебя там поиск маркера конца строки сможет обработать ситуацию, когда пара #13#10 будет разделена?
4 сен 19, 16:57    [21963695]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
И вообще, зря ты со строками связался...
4 сен 19, 16:58    [21963696]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
Док
Мужики,
понадобилось читать и писать вывод запускаемой внешней программы...

Задача именно в такой постановке? Нельзя что-то более вменяемое для обмена данными организовать?
4 сен 19, 17:01    [21963698]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Kazantsev Alexey
Кстати, у тебя там поиск маркера конца строки сможет обработать ситуацию, когда пара #13#10 будет разделена?

так вот, почему у тебя сначала #13 ищется, а потом #10. Таки придется от строк отказываться Картинка с другого сайта.

ёёёёё
Нельзя что-то более вменяемое для обмена данными организовать?

ты меня спрашиваешь? Название топика читал? Это я спросил совета, в надежде на твой ответ :)
4 сен 19, 17:11    [21963711]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30280

04.09.2019 16:34, Док пишет:

МП>> может так случиться, что ты получил из "трубы" последовательность, которая не заканчивается #10, #13, #13#10
> так я в коде вроде бы учел этот момент. Нет?

я твой код не вижу.
ты его в спойлер прячешь.
по NNTP оно не отображается.
а вообще, спойлеры для того, чтоб в них прятать женскую половую письку.
а не код, на техническом форуме.

> зы. вообще, я пишу для себя кроссплатформенную утилитку с использованием gbak/gfix/gstat/isql - покатаю код еще там...

все эти "кроссы" от лукавого.

Posted via ActualForum NNTP Server 1.5

4 сен 19, 17:13    [21963714]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Мимопроходящий
ты его в спойлер прячешь.
по NNTP оно не отображается.

"вон оно че, Михалыч" ©

а я пальцы и колесико мышки читающих берегу. Не люблю портянки кода на 3 экрана :)

Мимопроходящий
все эти "кроссы" от лукавого.

ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает :)
4 сен 19, 17:31    [21963744]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30280

04.09.2019 17:31, Док пишет:

МП>> все эти "кроссы" от лукавого.
> ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает :)

но gbak-и то есть и для линуха, и для винды.
а под яось нет и не будет.

Posted via ActualForum NNTP Server 1.5

4 сен 19, 17:49    [21963763]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Мимопроходящий
но gbak-и то есть и для линуха, и для винды.
а под яось нет и не будет.

сегодня для меня день открытий :)
4 сен 19, 18:19    [21963789]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
stanilar
Member

Откуда: Спб
Сообщений: 833
vavan
не поясните о чем речь?

На тот случай, когда из базы приходит больше двух(четырех) гигов.
5 сен 19, 09:53    [21964256]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
vavan
Member

Откуда: Казань
Сообщений: 3366
Док
Мимопроходящий
все эти "кроссы" от лукавого.

ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает
да вполне типичная ситуация для кучи проектов к-е из одной кодовой базы собираются и работают как под вынь так и хрюндиксы. я вот сервисы и туда и сюда собираю из vs, правда ни разу не морды так что иосы к счастью не беспокоят
5 сен 19, 09:56    [21964258]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
vavan
Member

Откуда: Казань
Сообщений: 3366
stanilar
На тот случай, когда из базы приходит больше двух(четырех) гигов
любопытно, жаль на посмотреть не выложено ведь?
5 сен 19, 09:58    [21964263]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
stanilar
Member

Откуда: Спб
Сообщений: 833
vavan
любопытно, жаль на посмотреть не выложено ведь?

stanilar
Но вот времени не было сделать, а теперь уже бывший дельфиец...


Нет, как уже было сказано, не выложено. Но время было интересное. Был молод, думал что знания о том, как работает менеджер памяти равносильно успеху в жизни. Все делал в поте лица. Правда, мне самому так и осталось не понятным, помогло-ли(потому и не стал выкладывать). А теперь уже нет ни времени дальше разбираться, ни желания копаться в том, что больше никогда не понадобится. Осталась только ностальгия по ушедшему без пользы.

P/S/ Могу выслать почтой то, что (возможно) было тем, о чем идет речь. Идея была в том, что DS работает с памятью аналогично TStream. Вот и был сделан наследник TStream для кэша DS, который окном в 64Кб читал/писал кэш. Сам наследник это отдельный компонент, а вот как хакнуть DS из родных библиотек это два сторонних компонента + танцы с бубном.
5 сен 19, 11:32    [21964358]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
vavan
Member

Откуда: Казань
Сообщений: 3366
stanilar
Могу выслать почтой то, что (возможно) было тем, о чем идет речь
+
в профиле ящик актуальный?
5 сен 19, 11:52    [21964383]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
stanilar
Member

Откуда: Спб
Сообщений: 833
vavan,

+
Да, только тему нужно написать читаемую, а то этот ящик у меня для всего. Пошел копать исходники
5 сен 19, 12:00    [21964390]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
vavan
Member

Откуда: Казань
Сообщений: 3366
stanilar,
+
в заголовке sql.ru
если таки разыщется и не жалко то я бы глянул из любопытства о чем речь. спасибо
5 сен 19, 12:39    [21964437]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
Док
...

ёёёёё
Нельзя что-то более вменяемое для обмена данными организовать?

ты меня спрашиваешь? Название топика читал? Это я спросил совета, в надежде на твой ответ :)

Ну я не знал, что тебе бэкап/рестор нужен FB. Поди из стартового топика пойми. Я вот в клиентское приложение встроил и бэкап, и рестор. Используя соотв. компоненты библиотеки доступа. И никакого чтения из памяти, десяток строк кода, и все.
Или тебе прямо обязательно именно в твоей постановке задачу решать?
5 сен 19, 12:46    [21964447]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30280

05.09.2019 12:46, ёёёёё пишет:
> Я вот в клиентское приложение встроил и бэкап, и рестор.
> Используя соотв. компоненты библиотеки доступа.

через TIBServices ты НЕ можешь получить бекап с удалённого сервера себе "у папочку" на десктопе.

Posted via ActualForum NNTP Server 1.5

5 сен 19, 14:09    [21964580]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
Мимопроходящий,

это да, но нужно ли сие топикстартеру?

ЗЫ: как-то делал копирование удаленной базы на локальный комп, тоже совсем немного работы: за основу взял пример "клонирование базы" из состава икземплов к UIB. Чуть доточил для фич новой СУБД, результаты сравнивал в DB Comparer.
5 сен 19, 14:23    [21964598]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
ёёёёё
Ну я не знал, что тебе бэкап/рестор нужен FB. Поди из стартового топика пойми. Я вот в клиентское приложение встроил и бэкап, и рестор. Используя соотв. компоненты библиотеки доступа. И никакого чтения из памяти, десяток строк кода, и все.

птицын b/r - это частный случай, который запросто решается в случае получения ответа на вопрос стартового топика.

Мимопроходящий
через TIBServices ты НЕ можешь получить бекап с удалённого сервера себе "у папочку" на десктопе.


Компоненты - оне пишутся компонентописателями. Тот IBX, который сейчас репах Лазаревского OPM, усиленно пилится и даже теперь позволяет динамически грузить клиентскую библу, как это делали ФИБы. Причем, он, автор, разделил свои компоненты условно на legacy (которые позволяли делать b/r только на стороне сервера) и современные (эти теоретически позволяют все), но они еще кривые, автор - обладает весьма большой инертностью и упрямством; пока его убедишь поправить тот или иной косяк, особенно, если он в этом не убежден .... :)

Посему проще написать свою гуишную обертку (к тому же, всегда есть возможность прикрутить к ней все новые фишки). И в простом варианте я это сделал, но хочется большего функционала красивостей, нежели есть в IBE, и проч.проч.
5 сен 19, 15:41    [21964699]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
Док,
автор
птицын b/r - это частный случай, который запросто решается в случае получения ответа на вопрос стартового топика.

Страшно представить, что ты затеял.
5 сен 19, 16:04    [21964729]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Во, наконец-то сегодня руки дошли. Код специально не прячу под спойлер для читающих по NNTP. Кому нетрудно, погоняйте у себя, плз (проект приаттачил) - теоретически должен работать и под стабильные Лазарь и фпц.

procedure TForm1.btnGoClick(Sender: TObject);
const
  BUF_SIZE = 1024*2; // Размер буфера для чтения выходных данных блоками
  ConstFormatStr = '%d. ~ %s';//строка формата для подстановки вывода текста в мемо
var
{$IFDEF MSWINDOWS}
Buffer: RawByteString = '';
BufferStg: RawByteString = '';//буфер-накопитель
{$ENDIF}
{$IFDEF UNIX}
Buffer: String = '';
BufferStg: String = '';//буфер-накопитель
{$ENDIF}
  StrCounter: Integer = 0;//счетчик выводимых memoOutput строк
  BytesRead: LongInt = 0;//кол-во считанных из буфера байт
  LineEndingPos_13: Integer = 0;//позиция символа возврата каретки #13(CR)
  LineEndingPos_10: Integer = 0;//позиция символа перевода строки #10(CR)
  dt: TDateTime;
begin
  memoOutput.Clear;

  {$IFDEF MSWINDOWS}
  // В Windows команду dir нельзя использовать напрямую, потому что она является встроенной
  // командой оболочки. Поэтому нужны cmd.exe и дополнительные параметры
  AProcess.Executable := 'c:\windows\system32\cmd.exe';
  AProcess.Parameters.Add('/c');
  AProcess.Parameters.Add('dir /s c:\windows\system32');
  {$ENDIF}
  {$IFDEF UNIX}
  AProcess.Executable := '/bin/ls';
  AProcess.Parameters.Add('--recursive');
  AProcess.Parameters.Add('--all');
  AProcess.Parameters.Add('-l');
  {$ENDIF}

  AProcess.Options := [poUsePipes, poStderrToOutPut, poNoConsole];

  //Запуск процесса (выполнение команды dir/ls)
  AProcess.Execute;

  dt:= Now;
  memoOutput.Lines.Add('==== процесс начат: ' + FormatDateTime('dd.mm.yyyy h:mm:ss:zzz am/pm',dt) + ' ====');
  memoOutput.Lines.Add('');

  SetLength(Buffer,BUF_SIZE);//задаем минимальный размер Buffer (как правило размер Pipes в ОС не превышает 2kB)
  BytesRead:= AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;

  repeat
    memoOutput.Lines.BeginUpdate;
    try
      if BytesRead > 0 then
      begin
        SetLength(Buffer,BytesRead);

        {LineEnding - алиас для sLineBreak:
        Win = #13#10
        Unix = #10
        Mac OS до v.9 = #13}

        {$IFDEF MSWINDOWS}
        //получаем позицию #13 в строке
        LineEndingPos_13:= Pos(#13,Buffer);

        repeat
          case LineEndingPos_13 of
            0:
              begin
                BufferStg:= BufferStg + Buffer;
              end;
            1://#13 в начале строки
              begin
                LineEndingPos_10:= Pos(#10, Buffer);

                case (LineEndingPos_10 - LineEndingPos_13) of
                  1: //#10(LF) следует за #13(CR)
                    begin
                      Inc(StrCounter);
                      //сбрасываем буфер-хранилище в memo...
                      memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,WinCPToUTF8(BufferStg)]));

                      //очищаем буфер-хранилище
                      BufferStg:='';

                      //откусываем от начала буфера символы перевода строки #13#10(CRLF)
                      Delete(Buffer,1,2); //... и крутим цикл дальше
                    end;
                  else //после #13(CR) следует любой символ, кроме #10(LF), или нет вообще символов
                    begin
                      //клеим символ возврата каретки #13(CR) к буферу-накопителю
                      BufferStg:= BufferStg + #13;

                      //откусываем от начала буфера символ возврата каретки #13(CR)
                      Delete(Buffer,1,1); //... и крутим цикл дальше
                    end;
                  end;
              end;
            else //#13(CR) в середине или в конце буфера
              LineEndingPos_10:= Pos(#10, Buffer);
              case (LineEndingPos_10 - LineEndingPos_13) of
                1: //#10(LF) следует за #13(CR)
                  begin
                    //копируем часть буфера до #13(CR) в буфер-хранилище
                    BufferStg:= BufferStg + Copy(Buffer,1,LineEndingPos_13 - 1);

                    Inc(StrCounter);

                    //сбрасываем буфер-хранилище в memo...
                    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,WinCPToUTF8(BufferStg)]));

                    //очищаем буфер-хранилище
                    BufferStg:='';

                    //отрезаем спереди часть буфера вместе BufferStg + символами перевода строки #13#10(CRLF)
                    Delete(Buffer,1, LineEndingPos_13 + 1);//... и крутим цикл дальше
                  end;
                else //после #13(CR) следует любой символ, кроме #10(LF), или нет вообще символов
                  begin
                    //клеим его к буферу-накопителю
                    BufferStg:= BufferStg + #13;

                    //откусываем от начала буфера символ возврата каретки #13(CR)
                    Delete(Buffer,1,1);//... и крутим цикл дальше
                  end;
              end;
          end;
          LineEndingPos_13:= Pos(#13,PChar(Buffer));
        until LineEndingPos_13 = 0;
        {$ENDIF}
        {$IFDEF UNIX}
        //получаем позицию #10 в строке
        LineEndingPos_10:= Pos(#10,Buffer);

        repeat
          case LineEndingPos_10 of
            0:
              begin
                BufferStg:= BufferStg + Buffer;
              end;
            1: //#10 в начале строки
              begin
                Inc(StrCounter);
                //сбрасываем буфер-хранилище в memo...
                memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));

                //очищаем буфер-хранилище
                BufferStg:='';

                //откусываем от начала буфера символ перевода строки #10(LF)
                Delete(Buffer,1,1);

                //... и крутим цикл дальше
              end
            else //#10(LF) в середине или в конце буфера
              begin
                //копируем часть Buffer до #10(LF) в буфер-накопитель
                BufferStg:= BufferStg + Copy(Buffer,1,LineEndingPos_10 - 1);

                Inc(StrCounter);
                //сбрасываем буфер-хранилище в memo...
                memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));


                //очищаем буфер-хранилище
                BufferStg:='';

                //отрезаем спереди часть буфера вместе BufferStg + символом перевода строки #10(LF)
                Delete(Buffer,1,LineEndingPos_10);

                //... и крутим цикл дальше
              end;
          end;
          LineEndingPos_10:= Pos(#10,Buffer);
        until LineEndingPos_10 = 0;
        {$ENDIF}
      end;
    finally
      memoOutput.Lines.EndUpdate;
      memoOutput.SelStart := UTF8Length(memoOutput.Text);
    end;
    Sleep(10);
    Application.ProcessMessages;

    SetLength(Buffer,BUF_SIZE);
    BytesRead:= AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;
  until BytesRead = 0;

  //сливаем остатки буфера-накопителя в Мемо
  if Length(BufferStg) > 0 then
  begin
    Inc(StrCounter);
    //сбрасываем буфер-хранилище в memo...
    {$IFDEF MSWINDOWS}
    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));
    {$ENDIF}
    {$IFDEF UNIX}
    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));
    {$ENDIF}

  end;
  dt:= Now;
  memoOutput.Lines.Add('');
  memoOutput.Lines.Add('==== процесс закончен: ' + FormatDateTime('dd.mm.yyyy h:mm:ss:zzz am/pm',dt) + ' ====');
end;


@Kazantsev Alexey

че-та не стал я заморачиваться с байтами (в отладке сложнее), со строками проще, тем более, что StringElementSize для стрингов в *nix'ах равен все равно равен StringElementSize для RawByteString под винды. Если покажешь пример, буду благодарен. :)

К сообщению приложен файл (project1.zip - 107Kb) cкачать
12 сен 19, 16:23    [21969638]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте с построчным чтением данных из памяти  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Док
че-та не стал я заморачиваться с байтами (в отладке сложнее), со строками проще

Чего там отлаживать, прости господи... Хотя, дело хозяйское, конечно.

Док
тем более, что StringElementSize для стрингов в *nix'ах равен все равно равен StringElementSize для RawByteString под винды

Пока равен.
12 сен 19, 18:38    [21969746]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить