На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Удалить буквы из строки до и после символа
    В текстовом файле список строк:
    User1 + User2 = 250 s\c
    User3 + User4 = 228 s\c
    User5 + User6 = 214 s\c

    Вопрос \ который интересует:

    Два варианта:
    Как удалить из текстового файла, указанные в Memo, буквы или слова до знака "="
    Как удалить из текстового файла, указанные в Memo, буквы или слова после знака "="


    Мой код делает удаление по всей строке:

    ExpandedWrap disabled
      var
      Files_1,Files_2:TextFile;
      s:string;
      dl: TStringList;
      i: integer;
      begin
      \\\\\\\\\\\\\ В цикле берутся (слова или буквы которые нужно удалить) из memo12
      dl := TStringList.Create;
      for i := 0 to Memo12.Lines.Count - 1 do
      dl.Add(Memo12.Lines[i]);
       
      \\\\\\\\\\\\\\\\
       
      while not Eof(Files_1) do begin
            Readln(Files_1, s);
       
         // Тут проверяю строку целиком [Вот как удалять из строки до символа '=' и после символа '=']
            for i := 0 to dl.Count - 1 do begin
           s := StringReplace(s, dl[i], '', [rfReplaceAll, rfIgnoreCase]);
            end;
       
              Writeln(Files_2, s);
          end;


    Как вариант, можно разделить строку на две по знаку =, потом в каждой полученной строке удалить то, что нужно, а потом почищенные строки склеить снова, не забыв знак = между ними. Но это очень неудобно.

    Подскажите более правильный вариант ?
    Сообщение отредактировано: Kirilis2018 -
      1вариант) Самый быстрый (наверняка так): найти знак равенства, скопировать всё последующее (или равное самому знаку) в начало строки.
      Пара "подводных камней":
      А) Если знаков '=' несколько, то условие нечёткое (т.е. неоднозначно понимаемое);
      Б) Если знак '=' установлен почти в начале строки, то копирование придётся вести посимвольное, что снизит скорость.

      Добавлено
      Кратко: strchr + memmove.
        Славян, Пока что тоже думаю но идей реализации (хороших, нет у меня).
          Цитата Славян @
          Цитата Kirilis2018 @
          буквы или слова до знака "="
          Кратко: strchr + memmove.

          Сложновато будет(откуда memmove). Легче так:
          Определение позиции знака "=" юзать pos('=',s)
          Удаления части строки - delete(s, начало, количество)
          Определение длины строки - length(s)
          :rolleyes:
            Руслан, Если не сложно, простой пример можете набросать ?
              Руслан, это всё (написанное вами) - весьма высокоуровневые операции. Длина же строки вообще мне видится ненужным вызовом. Так что таким путём, бесспорно, можно идти, но можно для скорости и низкоуровнево пошаманить... :blush:
                Цитата Kirilis2018 @
                [Вот как удалять из строки до символа '=' и после символа '=']

                удалить до символа =
                ExpandedWrap disabled
                  delete(s, 1, pos('=',s));


                или удалить после символа =
                ExpandedWrap disabled
                  tmpPos:=pos('=',s);//var tmpPos:integer;
                  delete(s, tmpPos, length(s)-tmpPos+1);
                Сообщение отредактировано: Руслан -
                  Грубая схема выглядит так:
                  ExpandedWrap disabled
                    be, p : Pointer;
                    be := Pointer(s); // адрес начала строки s, сюда начнём кидать новые буквы
                    p := Pos( '=', s); // адрес первого знака равенства
                    do be[0] := p[0], inc(be), inc(p) while( p[0]<>0 ); // кидаем буквы пока конец строки (0) не встретится
                    be[0] := 0; // ставим знак конца строки
                    Цитата Славян @
                    но можно для скорости и низкоуровнево пошаманить

                    Если человеку сложно простые операции на высоком уровне выполнять, низкий уровень(и всякие загадочные pointer :D ) мне кажется для него не лучший вариант, получится
                    :ph34r:
                    Сообщение отредактировано: Руслан -
                      Руслан,Славян, Ребята спасибо что уделили время, буду пробовать, может что и получится...
                      Сообщение отредактировано: Kirilis2018 -
                        Цитата Kirilis2018 @
                        Ребята спасибо что уделили время, буду пробовать, может что и получится...

                        Всё получится! :good:

                        Ещё, если на самом деле тебе нужно использовать обе части от разделителя "=", желательно задействовать Copy(s, начиная_от, кол-во_символов); :)
                          Цитата Руслан @
                          Если человеку сложно простые операции на высоком уровне выполнять, низкий уровень(и всякие загадочные pointer :D ) мне кажется для него не лучший вариант, получится
                          В целом, полностью с вами согласен. Замечу только лишь, что применение "высокоуровневых действий" больше похоже на заучивание непонятных правил; в то время как понимание "низкоуровневых" способно будет (медленно, но верно) набросать решение множества задач.
                          Но, честно говоря, ждут от Kirilis2018 наверняка ваш способ-путь, Руслан. :thanks:
                            Цитата Славян @
                            применение "высокоуровневых действий" больше похоже на заучивание непонятных правил; в то время как понимание "низкоуровневых" способно будет (медленно, но верно) набросать решение множества задач.

                            Понимаю и в целом поддерживаю вашу концепцию, но все же нахожу актуальным метод "от простого к сложному".

                            Высокий уровень изначально должен являться инструментом для упрощения программирования, и в большинстве случаев таковым является. Изучив высокий уровень, научившись решать на нем поставленные задачи, индивид может пойти по пути само-совершенствования (в итоге обретя умение строить более оптимизированные инструменты, фактически улучшать высокий уровень). :rolleyes:

                            Является ли использование справочника - "заучиванием непонятных правил"? - вроде бы нет. Собрать из предложенных функций код - дело не сложное, но требующее умения заюзать язык программирования. :)

                            Ну а более глубокое изучение структур информации в памяти эвм, рассмотрение инструментов для работы с ними - полагаю в следующей главе этой увлекательной истории. :)
                            Сообщение отредактировано: Руслан -
                              Цитата Руслан @
                              нахожу актуальным метод "от простого к сложному".
                              Да, полностью согласен! :good:

                              Цитата Руслан @
                              Высокий уровень изначально должен являться инструментом для упрощения программирования
                              Именно! И упрощение подразумевает, что человек уже хорошо знает мелочи, составные части, но ему надоело каждый раз ими заниматься и он решает написать много разных процедур, функций, чтобы вызовы их заменили кучу простого. Так и появляются Pos, length, delete, ...

                              Цитата Руслан @
                              более глубокое изучение структур информации в памяти эвм, рассмотрение инструментов для работы с ними - полагаю в следующей главе этой увлекательной истории.
                              А я всегда думал, что это в каком-то начале-прологе... :scratch:
                              :)
                                Руслан,
                                Славян,
                                У меня вот получилось вот такое извращение склепать. Работает но медленно как черепаха, даже на файле в 1 мегабайт (10 минут обработки) - Жесть!:

                                // Удаляет из текстового файла до знака "=" (Все буквы, слова что указанны в memo3)
                                // Удаление из текстового файла после знака "=" (Все буквы, слова что указанны в memo4)

                                Но скорость просто ужас - ПОМОГИТЕ ОПТИМИЗИРОВАТЬ! :wall:

                                ExpandedWrap disabled
                                  procedure Working(_L1, _L2: TStrings; Mode: boolean);
                                  var i, j: integer;
                                      s: String;
                                  begin
                                    for i := 0 to _L1.Count - 1 do
                                     begin
                                       if Mode then s := _L1.Names[i] else s := _L1.ValueFromIndex[i];
                                       for j := 0 to _L2.Count - 1 do
                                        s := StringReplace(s, _L2.Strings[j], '', [rfReplaceAll]);
                                       if Mode
                                        then _L1.Strings[i] := Format('%s=%s', [s, _L1.ValueFromIndex[i]])
                                        else _L1.Strings[i] := Format('%s=%s', [_L1.Names[i], s]);
                                     end;
                                  end;
                                   
                                  procedure TForm1.Button1Click(Sender: TObject);
                                  var
                                  Files_1: TextFile;
                                  S: string;
                                  mas: array of string;
                                  Found: Boolean;
                                  i: integer;
                                  Sl: TStringList;
                                  begin
                                  if OpenDialog1.Execute then
                                  begin
                                       AssignFile(Files_1, OpenDialog1.FileName);
                                       reset(Files_1);
                                       end;
                                   
                                    sl:=TStringList.Create;
                                   while not Eof(Files_1) do
                                    begin
                                    ReadLn(Files_1, S);
                                   
                                     // Удаляет из текстового файла до знака "=" (Все что указанно в memo3)
                                     if sl.Count > 0 then Working(sl, Memo3.Lines, true);
                                     // Удаление из текстового файла после знака "=" (Все что указанно в memo4)
                                     if sl.Count > 0 then Working(sL, Memo4.Lines, false);
                                      sL.Add(s);
                                   
                                     end;
                                    sl.SaveToFile(ExtractFileDir(OpenDialog1.FileName)+'\ Text_File_Save.txt');
                                  CloseFile(Files_1);
                                  end;
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0412 ]   [ 17 queries used ]   [ Generated: 18.04.24, 22:55 GMT ]