powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Форматирование текста
74 сообщений из 74, показаны все 3 страниц
Форматирование текста
    #39527614
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как решить проблеммку.
Имеется файл в 40-50-100 тысяч строк.
Строка формата
Код: html
1.
         С.    Л.    З.    C.    В. ЛС               Фамилия         Имя            Отчество          Дата        Осн. документ     Серия,       Личный номер       Дата         Дата  Дата рег. по ПрТипДатаДаДата        Адрес ЛС


Как можно заменить пробелы между словами на один знак табуляции. Чтобы в результате получить нормально отформатированный текст, который бы разбивался на колонки в Excele(к примеру).
...
Рейтинг: 0 / 0
Форматирование текста
    #39527615
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простенький цикл, заменяющий два пробела подряд табуляцией и убирающий все последующие
пробелы. В чём проблема-то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форматирование текста
    #39527632
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm1.Button2Click(Sender: TObject);
var SL: TStringList;
    i,j: integer;
    S: string;
begin
  SL := TStringList.Create;
//  SL.LoadFromFile();
  SL.Add('         С.    Л.    З.    C.    В. ЛС               Фамилия         Имя            Отчество          Дата        Осн. документ     Серия,       Личный номер       Дата         Дата  Дата рег. по ПрТипДатаДаДата        Адрес ЛС');
  for i := 0 to SL.Count-1 do begin
    S := SL[i];
    repeat
      j := Pos('  ',S);
      if j > 0 then S := StringReplace(S,'  ',' ',[rfReplaceAll]);
    until j = 0;
    SL[j] := StringReplace(S,' ',#9,[rfReplaceAll]);
  end;
end;
...
Рейтинг: 0 / 0
Форматирование текста
    #39527661
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

Со строкой работает, с файлом не хочет( Что не так?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm1.sButton1Click(Sender: TObject);
var SL: TStringList;
    i,j: integer;
    S: string;
    path:string;
begin
getdir(0,path);
  SL := TStringList.Create;
SL.LoadFromFile(path+'\1.txt');
// SL.Add(sedit1.text);
   for i := 0 to SL.Count-1 do begin
    S := SL[i];
    repeat
      j := Pos('  ',S);
      if j > 0 then S := StringReplace(S,'  ',' ',[rfReplaceAll]);
    until j = 0;
    SL[j] := StringReplace(S,' ',#9,[rfReplaceAll]);
  end;
 sl.SaveToFile(path+'\result.txt');
//sEdit2.Text:=sl.Text;
sl.Free;
end;
...
Рейтинг: 0 / 0
Форматирование текста
    #39527668
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял почему не работает.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527710
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вариант оптимизированный


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function Skip(const str: string): string;
var
  p: PChar;
  l, r: Integer;
  b: Boolean;
begin
  l := Length(str);
  SetLength(Result, l);
  r := 1;
  p := Pointer(str);
  while p^ <> #0 do
  begin
    if (p^ = ' ') and ((p + 1)^ = ' ') then
      b := true;

    Result[r] := p^;
    inc(p);
    inc(r);

    if b then
    begin
      b := False;
      while p^ = ' ' do
        inc(p);
    end;
  end;
  SetLength(Result, r - 1);
end;

var
  str: string;

begin
  try
    str := 'g 54   6767   67 rh';
    str := Skip(str);
    Writeln(str);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527849
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Можно поинтересоваться, в каком языке слово skip имеет отношение к форматированию ?
...
Рейтинг: 0 / 0
Форматирование текста
    #39527913
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНяшик,

Можно поинтересоваться, в каком языке слово skip имеет отношение к форматированию ?

Имелось введу скипнуить лишние пробелы. Имя функции больше не на что не рассчитано. Оно очень глупое и не целесообразное.

Конечно в производство такое нельзя пихать, иначе это станет головной болью. Но это всего лишь демонстрация
...
Рейтинг: 0 / 0
Форматирование текста
    #39527970
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикschiНяшик,

Можно поинтересоваться, в каком языке слово skip имеет отношение к форматированию ?

Имелось введу скипнуить лишние пробелы. Имя функции больше не на что не рассчитано. Оно очень глупое и не целесообразное.

Конечно в производство такое нельзя пихать, иначе это станет головной болью. Но это всего лишь демонстрация

Такой код вообще никуда нельзя, даже для демонстрации.
Sad but true.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527976
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

ты Лошарик, а не Няшик. Надеюсь, тебе стыдно.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527979
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД ,
ты Лошарик, а не Няшик. Надеюсь, тебе стыдно.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527989
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, мне не должно быть стыдно...

Это вам, раз вы не можете без длинной функции Pos

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
function Pos(const SubStr, Str: UnicodeString; Offset: Integer): Integer; overload;
var
  I, LIterCnt, L, J: Integer;
  PSubStr, PS: PChar;
  LCh: Char;
begin
  PSubStr := Pointer(SubStr);
  PS := Pointer(Str);
  if (PSubStr = nil) or (PS = nil) or (Offset < 1) then
    Exit(0);
  L := __StringLength(SubStr);
  { Calculate the number of possible iterations. }
  LIterCnt := __StringLength(Str) - Offset - L + 2;
  if (L > 0) and (LIterCnt > 0) then
  begin
    Inc(PS, Offset - 1);
    I := 0;
    LCh := PSubStr[0];
    if L = 1 then   // Special case when Substring length is 1
      repeat
        if PS[I] = LCh then
          Exit(I + Offset);
        Inc(I);
      until I = LIterCnt
    else
      repeat
        if PS[I] = LCh then
        begin
          J := 1;
          repeat
            if PS[I + J] = PSubStr[J] then
            begin
              Inc(J);
              if J = L then
                Exit(I + Offset);
            end
            else
              Break;
          until False;
        end;
        Inc(I);
      until I = LIterCnt;
  end;

  Result := 0;
end;




Без длмнной функции StringReplace

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
function StringReplace(const Source, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
var
  Str: string;
  xOldPattern: string;
  FoundPos: Integer;
  I, J: Integer;
  SourceIdx: Integer;
  DestIdx: Integer;
  LCharsToCopy: Integer;
  FindCount: Integer;
  PosArray: array of Integer;
  LenOP: Integer;
  LenNP: Integer;
  LenS: Integer;
  ArrLen: Integer;
  LPResult, LPSource, LPNewPattern: PChar;
  LReplaceAll: Boolean;
begin
  LenOP := Length(OldPattern);
  LenS := Length(Source);
  if (LenOP = 0) or (LenS = 0) then
    Exit(Source);

  if rfIgnoreCase in Flags then
  begin
    xOldPattern := AnsiUpperCase(OldPattern);
    LenOP := Length(xOldPattern);
    if SameStr(xOldPattern, AnsiLowerCase(OldPattern)) then // Special case, for example only symbols (+ - , * .....)
      Str := Source
    else
    begin
      Str := AnsiUpperCase(Source);
      LenS := Length(Str);
    end;
  end
  else
  begin
    xOldPattern := OldPattern;
    Str := Source;
  end;

  if Str.Length <> Source.Length then
  begin
    Result := '';
    I := Low(string);
    while I <= High(Source) do
    begin
      if string.Compare(Source, I - Low(string), OldPattern, 0, LenOP, True) = 0 then
      begin
        Result := Result + NewPattern;
        Inc(I, LenOP);
        if not (rfReplaceAll in Flags) then
        begin
          Result := Result + Source.Substring(I - Low(string), MaxInt);
          Break;
        end;
      end
      else
      begin
        Result := Result + Source[I];
        Inc(I);
      end;
    end;
  end
  else
  begin
    FoundPos := 1;
    FindCount := 0;
    ArrLen := 0;
    LReplaceAll := not (rfReplaceAll in Flags);
    repeat
      FoundPos := Pos(xOldPattern, Str, FoundPos);
      if FoundPos = 0 then
        Break;

      Inc(FindCount);
      if ArrLen < FindCount then
      begin
        if ArrLen = 0 then
          ArrLen := 32
        else
          ArrLen := ArrLen * 2;
        SetLength(PosArray, ArrLen);   // call SetLength less frequently makes a huge difference when replacing multiple occurrences
      end;
      PosArray[FindCount - 1] := FoundPos - 1; // Zero based array
      Inc(FoundPos, LenOP);
    until LReplaceAll;

    if FindCount > 0 then
    begin
      LenNP := Length(NewPattern);
      LPSource := Pointer(Source);           // We use a pointer cast to avoid the _UStrToPWChar call injected by the compiler
      LPNewPattern := Pointer(NewPattern);  // We use a pointer cast to avoid the _UStrToPWChar call injected by the compiler
      if LenNP = LenOP then
      begin                           // special case where Length(OldPattern) = Length(NewPattern)
        SetLength(Result, LenS);      // in this case, we can optimize it even further
        LPResult := Pointer(Result);    // We use a pointer cast to avoid the uniquestring call injected by the compiler
        Move(LPSource^, LPResult^, LenS * SizeOf(Char));
        if LenNP = 1 then
          for I := 0 to FindCount - 1 do
            LPResult[PosArray[I]] := LPNewPattern^
        else if LenNP <= 8 then
          for I := 0 to FindCount - 1 do
            for J := 0 to LenNP -1  do
              LPResult[PosArray[I] + J] := LPNewPattern[J]
        else
          for I := 0 to FindCount - 1 do
            Move(LPNewPattern^, LPResult[PosArray[I]], LenNP * SizeOf(Char));
      end
      else
      begin
        SetLength(Result, LenS + ((LenNP - LenOP) * FindCount));
        LPResult := Pointer(Result);    // We use a pointer cast to avoid the uniquestring call injected by the compiler
        SourceIdx := 0;
        DestIdx := 0;
        if LenNP = 0 then
          for I := 0 to FindCount - 1 do
          begin
            LCharsToCopy := PosArray[I] - SourceIdx;
            if LCharsToCopy > 0 then
            begin
              if LCharsToCopy = 1 then
              begin
                LPResult[DestIdx] := LPSource[SourceIdx];
                Inc(SourceIdx);
                Inc(DestIdx);
              end
              else if LCharsToCopy <= 8 then
              begin
                for J := 0 to LCharsToCopy - 1  do
                  LPResult[DestIdx + J] := LPSource[SourceIdx + J];
                Inc(SourceIdx, LCharsToCopy);
                Inc(DestIdx, LCharsToCopy);
              end
              else
              begin
                Move(LPSource[SourceIdx], LPResult[DestIdx], LCharsToCopy * SizeOf(Char));
                Inc(SourceIdx, LCharsToCopy);
                Inc(DestIdx, LCharsToCopy);
              end;
            end;
            Inc(SourceIdx, LenOP);
          end
        else if LenNP = 1 then
          for I := 0 to FindCount - 1 do
          begin
            LCharsToCopy := PosArray[I] - SourceIdx;
            if LCharsToCopy > 0 then
            begin
              if LCharsToCopy = 1 then
              begin
                LPResult[DestIdx] := LPSource[SourceIdx];
                Inc(SourceIdx);
                Inc(DestIdx);
              end
              else if LCharsToCopy <= 8 then
              begin
                for J := 0 to LCharsToCopy - 1  do
                  LPResult[DestIdx + J] := LPSource[SourceIdx + J];
                Inc(SourceIdx, LCharsToCopy);
                Inc(DestIdx, LCharsToCopy);
              end
              else
              begin
                Move(LPSource[SourceIdx], LPResult[DestIdx], LCharsToCopy * SizeOf(Char));
                Inc(SourceIdx, LCharsToCopy);
                Inc(DestIdx, LCharsToCopy);
              end;
            end;
            LPResult[DestIdx] := LPNewPattern[0];
            Inc(DestIdx);
            Inc(SourceIdx, LenOP);
          end
        else
          for I := 0 to FindCount - 1 do
          begin
            LCharsToCopy := PosArray[I] - SourceIdx;
            if LCharsToCopy > 0 then
            begin
              if LCharsToCopy = 1 then
              begin
                LPResult[DestIdx] := LPSource[SourceIdx];
                Inc(SourceIdx);
                Inc(DestIdx);
              end
              else if LCharsToCopy <= 8 then
              begin
                for J := 0 to LCharsToCopy - 1  do
                  LPResult[DestIdx + J] := LPSource[SourceIdx + J];
                Inc(SourceIdx, LCharsToCopy);
                Inc(DestIdx, LCharsToCopy);
              end
              else
              begin
                Move(LPSource[SourceIdx], LPResult[DestIdx], LCharsToCopy * SizeOf(Char));
                Inc(SourceIdx, LCharsToCopy);
                Inc(DestIdx, LCharsToCopy);
              end;
            end;
            Move(LPNewPattern^, LPResult[DestIdx], LenNP * SizeOf(Char));
            Inc(DestIdx, LenNP);
            Inc(SourceIdx, LenOP);
          end;

        LCharsToCopy := LenS - SourceIdx;
        if LCharsToCopy > 0 then
          Move(LPSource[SourceIdx], LPResult[DestIdx], LCharsToCopy * SizeOf(Char));
      end;
    end
    else
      Result := Source;
  end;
end;




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

Функция SetLength не копирует строку в моём случае, а делает реллок - уменьщая длину.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527990
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эти функции плохи тем, что они гоняют одни и те же строки по много раз. И тормозят код во много. Мой же код, использует два цикла. Один, что бы прогнать основную строку, и второй - убрать лишние пробелы.

Просто - та кода. А у вас - дикий лес из тормозов.


Полезные ресурсы тратите попросту.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527993
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К тому - же, времени я угрохал не больше 30 секунд на написания своего кода...

А вот в случае кода DimaBr, думаю столько - же. Только на + 10 и даже + 20 секунд дольше. Так как его код сложен в понимании. А мой лёгкий как при написании, так в чтении.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527994
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, сижу и в голову взбрело.
Сейчас же по налетите как мухи, и будите твердить
- быстрота кода не важна, для бизнес приложения.
- Грех не использовать что заложили в функционал среды - разработчики умнее

Это всё чистые предрассудки. Быстрота кода нужна - для быстрой сортировки, к примеру.

К тому - же, далеко не известно какое железо будет у пользователя. И на сколько под хламом прогибаться. Так что ваш код из pos и StringReplace может и пару минут работать на файлах в 100 тысяч строк.
...
Рейтинг: 0 / 0
Форматирование текста
    #39527997
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЭто вам, раз вы не можете без длинной функции Pos
...
Эти функции плохи тем, что они гоняют одни и те же строки по много раз.

Покажи в коде "плохой" функции Pos(). В каком именно месте там "гоняются строки по много раз".
...
Рейтинг: 0 / 0
Форматирование текста
    #39528001
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД[
Покажи в коде "плохой" функции Pos(). В каком именно месте там "гоняются строки по много раз".

Давай подсчитаем.

Первый цикл
Код: pascal
1.
for i := 0 to SL.Count-1 do begin



В функции Pos идут уже два цикла repeat until
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   repeat
        if PS[I] = LCh then
        begin
          J := 1;
          repeat
            if PS[I + J] = PSubStr[J] then
            begin
              Inc(J);
              if J = L then
                Exit(I + Offset);
            end
            else
              Break;
          until False;
        end;
        Inc(I);
      until I = LIterCnt;



Теперь, отбрасываем все проверки (Туча проверок! ДОХРЕНИЩЕ)
И смело считаем сколько раз нам надо потратить только тактов на функцию POS в обходе цикла for для длины SL.Count

(В частности, вы должны учесть - то, что мы не идём от строки к строке. Мы ещё режим саму строку - удаляя из неё лишние пробелмы, прежде чем перейти к следующей.)

Код: pascal
1.
2.
3.
4.
  repeat
      j := Pos('  ',S);
      if j > 0 then S := StringReplace(S,'  ',' ',[rfReplaceAll]);
    until j = 0;




Осознаёшь сколько работает лишнего кода под капотом ? Не уважаю я такой код.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528005
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНе уважаю я такой код.Смысла уважать код, который никак не решает задачу ТС, тоже нет
...
Рейтинг: 0 / 0
Форматирование текста
    #39528008
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНяшикНе уважаю я такой код.Смысла уважать код, который никак не решает задачу ТС, тоже нет

Кто сказал что не решает?

...
Рейтинг: 0 / 0
Форматирование текста
    #39528010
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот прямая ссылка на картинку
http://www.fotolink.su/pic_b/4304d4bd6ad9fd1e130e29e8973c742e.png
...
Рейтинг: 0 / 0
Форматирование текста
    #39528011
crossa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик,

Ваш код быстрее и эффективнее, не о чем тут спорить.
Надо присвоить значение переменной b в начале функции Skip:
Код: pascal
1.
b := False;
...
Рейтинг: 0 / 0
Форматирование текста
    #39528012
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crossa,

Да, действительно. Для лазура бы это было актуально. Но для Delphi они по умолчанию в false встаёт, по этому у меня не было в мыслях написать это условие.


Хотя если я не прав, и при каких - то условиях вместо false компилятор Delphi может выделить true, то поправьте.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528015
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикчччД[
Покажи в коде "плохой" функции Pos(). В каком именно месте там "гоняются строки по много раз".

Давай подсчитаем.

Первый цикл
Код: pascal
1.
for i := 0 to SL.Count-1 do begin



В функции Pos идут уже два цикла repeat until
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   repeat
        if PS[I] = LCh then
        begin
          J := 1;
          repeat
            if PS[I + J] = PSubStr[J] then
            begin
              Inc(J);
              if J = L then
                Exit(I + Offset);
            end
            else
              Break;
          until False;
        end;
        Inc(I);
      until I = LIterCnt;



...

В каком конкретно месте "гоняются строки по много раз". Покажи. Хотя бы одну-единственную строчку.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528016
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик...Но для Delphi они по умолчанию в false встаёт...
Локальные переменные будут тебе инициализироваться, ага.

Точно Лошарик.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528018
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНяшикпропущено...


Давай подсчитаем.

Первый цикл
Код: pascal
1.
for i := 0 to SL.Count-1 do begin



В функции Pos идут уже два цикла repeat until
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   repeat
        if PS[I] = LCh then
        begin
          J := 1;
          repeat
            if PS[I + J] = PSubStr[J] then
            begin
              Inc(J);
              if J = L then
                Exit(I + Offset);
            end
            else
              Break;
          until False;
        end;
        Inc(I);
      until I = LIterCnt;



...

В каком конкретно месте "гоняются строки по много раз". Покажи. Хотя бы одну-единственную строчку.

Да ты просто издеваешься - понимая что код тот очень тормознутый. И меня просто зассрать хочешь - ох делать тебе нефиг. Я ведь показал как обойтись без гадости этакой.

чччДНяшик...Но для Delphi они по умолчанию в false встаёт...
Локальные переменные будут тебе инициализироваться, ага.

Точно Лошарик.


Вечно меня тут оскорбляешь. Хотя сам и пальцем не пошевелил. Жена в постельке не даёт? Ох бедненький, ну хорошо что я могу помочь тебе хоть как то неновисть выместить. Крепись там.

Да, я провёл аналогию. Первая переменная bool всегда в false. На неё прямой адрес стоит, дебагер показал
Код: pascal
1.
004D89A0 40               inc eax



Все остальные идут уже через смещения ebp
...
Рейтинг: 0 / 0
Форматирование текста
    #39528020
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

и так, ни одной строки кода, где "гоняются строки по много раз" строки, ты не привел. Невменяемость.

НяшикПервая переменная bool всегда в false.
Еще раз: это локальная переменная. Упоротость.

И "Лошарик" - это слишком мягко.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528021
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНяшик,

и так, ни одной строки кода, где "гоняются строки по много раз" строки, ты не привел. Невменяемость.

НяшикПервая переменная bool всегда в false.
Еще раз: это локальная переменная. Упоротость.

И "Лошарик" - это слишком мягко.

Всё что надо, я уже привёл в данном сообщение 20830577

Няшик
Код: pascal
1.
2.
3.
4.
  repeat
      j := Pos('  ',S);
      if j > 0 then S := StringReplace(S,'  ',' ',[rfReplaceAll]);
    until j = 0;




Логик, вовсе не я ... В данном коде уже и гоняется одна единственная строка очень много раз.

Ты когда машину покупаешь, и производитель подсовывает не настроенный карбюратор который сосёт бенз понапрасну. Тоже будешь защищать? Ну тогда лашарик больше подходит не мне. А..


В общем, не вижу повода больше продолжать с тобою разговор. Тема превращается в муссор от твоих сообщений упортых
...
Рейтинг: 0 / 0
Форматирование текста
    #39528137
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЭти функции плохи тем, что они гоняют одни и те же строки по много раз. И тормозят код во много. Мой же код, использует два цикла. Один, что бы прогнать основную строку, и второй - убрать лишние пробелы.

Просто - та кода. А у вас - дикий лес из тормозов.


Полезные ресурсы тратите попросту.

Расскажи это веб-программистам (на том же PHP/Javascript). Там под капотом столько трат полезных ресурсов, что впору кампанию за спасение вселенной от тепловой смерти организовывать.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528145
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiРасскажи это веб-программистам (на том же PHP/Javascript). Там под капотом столько трат полезных ресурсов, что впору кампанию за спасение вселенной от тепловой смерти организовывать.

Веб - это веб, и там бесполезно что либо говорить. А тут - всё в руках самого программиста.

По этому, я и пишу свой интерпретатор.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528183
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш код с указателями труден для понимания начинающим программистам.
Если человек не может самостоятельно написать элементарный код с заменой пробелов, то о каких указателях может идти речь ?
О скорости для разовой операции в 100к строк говорить не приходится. 5 секунд не имеют никакого значения
...
Рейтинг: 0 / 0
Форматирование текста
    #39528203
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

=_= Если спорить о понимании указателей, и с тем - как работать с данными функциями Pos и StringReplace, с их аргументами и.т.д.

То указатели это маленькие ясли. По сравнению с бугаями

Код: pascal
1.
var1 = P^; // Берём указатель на текущий элемент



Код: pascal
1.
var1 = (P + 1)^;  // Смещаем указатель на SizeOf(P) * 2. И берём текущий  элемент. 




Код: pascal
1.
inc(p); // Просто перемещаем на следующий элемент, текущий указатель p = p  + (SizeOf(P) * 2);



Ай как сложно.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528212
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикВеб - это веб, и там бесполезно что либо говорить. А тут - всё в руках самого программиста.

По этому, я и пишу свой интерпретатор.

На ассемблере, чтобы впустую ценные ресурсы не тратить ?
...
Рейтинг: 0 / 0
Форматирование текста
    #39528217
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНа ассемблере, чтобы впустую ценные ресурсы не тратить ?

Это уже идеологии. Даже на c++ используют ассемблер, дабы оптимизировать - то, что не оптимизируется.

В частности, это какие нибудь инструменты по работе с изображением, и.т.д.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528262
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикКто сказал что не решает?Я. Прочти внимательнее что именно надо ТС-у
...
Рейтинг: 0 / 0
Форматирование текста
    #39528300
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНяшикКто сказал что не решает?Я. Прочти внимательнее что именно надо ТС-у

Приношу извинения за свою не внимательность. Между словами, на символ таба

Вот реализация

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
  w: Boolean;
begin
  l := Length(str);
  SetLength(Result, l);

  w := False;
  r := 1;
  c := 1;
  while r <= l do
  begin
    if w and (str[r] = ' ') and (str[r + 1] = ' ') then
    begin
      Result[c] := #$9;
      inc(r, 2);
      while str[r] = ' ' do
        inc(r);
    end
    else
    begin
      Result[c] := str[r];
      w := str[r] <> ' ';
      inc(r);
    end;
    inc(c);
  end;
  SetLength(Result, r - 1);
end;

...
Рейтинг: 0 / 0
Форматирование текста
    #39528411
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrО скорости для разовой операции в 100к строк говорить не приходится. 5 секунд не имеют никакого значения
Кто сказал, что для разовой?
А если это постоянная операция, параллельно выполняемая в сотне потоков по 10000 раз?
Во и будет разница. Не то, что секунды важны. Проценты прироста производительности бывают важны.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528498
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикwhite_niggerпропущено...
Я. Прочти внимательнее что именно надо ТС-у

Приношу извинения за свою не внимательность. Между словами, на символ таба

Вот реализация

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
  w: Boolean;
begin
  l := Length(str);
  SetLength(Result, l);

  w := False;
  r := 1;
  c := 1;
  while r <= l do
  begin
    if w and (str[r] = ' ') and (str[r + 1] = ' ') then
    begin
      Result[c] := #$9;
      inc(r, 2);
      while str[r] = ' ' do
        inc(r);
    end
    else
    begin
      Result[c] := str[r];
      w := str[r] <> ' ';
      inc(r);
    end;
    inc(c);
  end;
  SetLength(Result, r - 1);
end;



Ты уверен, что твоя реализация работает ? Я не уверен.
В этой строчке условие должно выполняться, если следуют три пробела подряд.

Код: pascal
1.
 if w and (str[r] = ' ') and (str[r + 1] = ' ') then
...
Рейтинг: 0 / 0
Форматирование текста
    #39528539
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНяшикпропущено...


Приношу извинения за свою не внимательность. Между словами, на символ таба

Вот реализация

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
  w: Boolean;
begin
  l := Length(str);
  SetLength(Result, l);

  w := False;
  r := 1;
  c := 1;
  while r <= l do
  begin
    if w and (str[r] = ' ') and (str[r + 1] = ' ') then
    begin
      Result[c] := #$9;
      inc(r, 2);
      while str[r] = ' ' do
        inc(r);
    end
    else
    begin
      Result[c] := str[r];
      w := str[r] <> ' ';
      inc(r);
    end;
    inc(c);
  end;
  SetLength(Result, r - 1);
end;



Ты уверен, что твоя реализация работает ? Я не уверен.
В этой строчке условие должно выполняться, если следуют три пробела подряд.

Код: pascal
1.
 if w and (str[r] = ' ') and (str[r + 1] = ' ') then



Уверен
Код: pascal
1.
  w := str[r] <> ' ';
...
Рейтинг: 0 / 0
Форматирование текста
    #39528543
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикschiпропущено...


Ты уверен, что твоя реализация работает ? Я не уверен.
В этой строчке условие должно выполняться, если следуют три пробела подряд.

Код: pascal
1.
 if w and (str[r] = ' ') and (str[r + 1] = ' ') then



Уверен
Код: pascal
1.
  w := str[r] <> ' ';



Код: pascal
1.
2.
     w := str[r] <> ' ';
      inc(r);



r уже на следующий неизвестный символ строки указывает

Код: pascal
1.
 if w and (str[r] = ' ') and (str[r + 1] = ' ') then



В этом случае, чтобы сработало условие, нужно, чтобы символ по текущему r-1 б был равен пробелу (чтобы w стало истинным), символ по текущему r был пробелом и символ по r+1 был пробелом.
Итого, три пробела подряд заменяются табом.

А за идентфикатор l, который легко принять за 1 тебе в аду будет отдельная сковородка приготовлена, с ускоренным подогревом.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528578
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Кхм. Мы смотрим - не был ли текущий символ пробелом, если нет, то true.


Я ничего тебе объяснять не хочу. Я всего лишь приложу скриншот.

...
Рейтинг: 0 / 0
Форматирование текста
    #39528580
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно срезал один символ пока копировал


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
  w: Boolean;
begin
  l := Length(str);
  SetLength(Result, l);

  w := False;
  r := 1;
  c := 1;
  while r <= l do
  begin
    if w and (str[r] = ' ') and (str[r + 1] = ' ') then
    begin
      Result[c] := #$9;
      inc(r, 2);
      while str[r] = ' ' do
        inc(r);
    end
    else
    begin
      Result[c] := str[r];
      w := str[r] <> ' ';
      inc(r);
    end;
    inc(c);
  end;
  SetLength(Result, r - 1);
end;

var
  str: string;

begin
  try
    str := '  g 54           6767         67  rh';
    str := RepSpToTabs(str);
    Writeln(str);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

...
Рейтинг: 0 / 0
Форматирование текста
    #39528582
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрин отладки ещё приложу

...
Рейтинг: 0 / 0
Форматирование текста
    #39528589
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiА за идентфикатор l, который легко принять за 1 тебе в аду будет отдельная сковородка приготовлена, с ускоренным подогревом.

не.
он не понимает
...
Рейтинг: 0 / 0
Форматирование текста
    #39528592
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguin
не.
он не понимает

Да какая разница, если пример демонстрационный. У некоторых мозги в кашку поехали, от лени с этими функциями pos и str replace

Такое чувства что сложное что они делают, это дают правильные и красивые имена переменным, и на этом в общем - то всё.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528595
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно дальтоником надо быть, что бы спутать синюю букву с чёрной

...
Рейтинг: 0 / 0
Форматирование текста
    #39528599
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНаверно дальтоником надо быть, что бы спутать синюю букву с чёрной



рад за ваше зрение

но все таки
Джон Ф. ВудсПишите код, исходя из того, что все программисты, которые будут сопровождать вашу программу, — склонные к насилию психопаты, знающие, где вы живёте.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528602
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguinно все таки
Джон Ф. ВудсПишите код, исходя из того, что все программисты, которые будут сопровождать вашу программу, — склонные к насилию психопаты, знающие, где вы живёте.

...
Рейтинг: 0 / 0
Форматирование текста
    #39528639
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Няшик]Наверно дальтоником надо быть, что бы спутать синюю букву с чёрной


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
  w: Boolean;
begin
  l := Length(str);
  SetLength(Result, l);

  w := False;
  r := 1;
  c := 1;
  while r <= l do
  begin
    if w and (str[r] = ' ') and (str[r + 1] = ' ') then
    begin
      Result[c] := #$9;
      inc(r, 2);
      while str[r] = ' ' do
        inc(r);
    end
    else
    begin
      Result[c] := str[r];
      w := str[r] <> ' ';
      inc(r);
    end;
    inc(c);
  end;
  SetLength(Result, r - 1);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := RepSpToTabs(Edit1.Text);
  Edit2.Text := StringReplace(S, #9, '#9', [rfReplaceAll]);
end;



Отлаживайся. Я могу набрать строку, в которой в начале несколько пробелов - результат получается более чем занимательный.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528640
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Все оптимизаторы одинаковые, выкладывают портянку нечитаемого и косячного кода за портянкой, обливая всех дерьмом попутно.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528642
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Я не понимаю, что мне отлаживать???.... Автору надо заменить более двух пробелов , после слова


...
Рейтинг: 0 / 0
Форматирование текста
    #39528656
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Няшик]schi,

Я не понимаю, что мне отлаживать???.... Автору надо заменить более двух пробелов , после слова

Если только после слова. Чем твой код плох - из него ничего нельзя понять.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528660
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiЕсли только после слова. Чем твой код плох - из него ничего нельзя понять.

Увы - вы правы. С таким умом как у вас - скорее всего нельзя.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
  w: Boolean;
begin
  l := Length(str); // Узнаём длину строки
  SetLength(Result, l); // Увеличиваем результат строки до длины самой строки

  w := False; // Ставим какой - то флаг в неправду (Пока какой, не знаем - смотрим дальше)
  r := 1; // Бла бла
  c := 1;  // Бла бла
  while r <= l do // Гоним цикл, пока r не будет больше или ровно l
  begin
    if w and (str[r] = ' ') and (str[r + 1] = ' ') then // Наш флаг непонятный должен быть в true и спереди два пробела. 
    begin  
      // Ура, выше условие совпала 
      Result[c] := #$9;  // Заменяем 1 символ 
      inc(r, 2); // Скипываем два пробельных символа. 
      while str[r] = ' ' do // Есть ещё пробелы ? Долой их!
        inc(r); 
    end
    else
    begin
      // Увы - условие не совпала
      Result[c] := str[r]; // Пишем текущий стэк строки, в текущий стек результата функции 
      w := str[r] <> ' '; // ... Ой! Вот для чего флаг. Если текущий символ был не пробел, он будет TRUE
      inc(r); // бла бла 
    end;
    inc(c); // бла бла 
  end;
  SetLength(Result, r - 1); // Уменьшим длину строки
end;




Ай - как сложно
...
Рейтинг: 0 / 0
Форматирование текста
    #39528668
SimplTsar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик
Код: pascal
1.
2.
      while str[r] = ' ' do // Есть ещё пробелы ? Долой их!
        inc(r); 



отсутсвие проверки Length(str) при удачном сочетании данных - бесконечный цикл или Access Violation
...
Рейтинг: 0 / 0
Форматирование текста
    #39528693
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SimplTsar,

Весело такую Ахинею читать))), при условии r <= l. И при том, что строка кончается на #0 а это не ' '
...
Рейтинг: 0 / 0
Форматирование текста
    #39528730
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикSimplTsar,

Весело такую Ахинею читать))), при условии r <= l. И при том, что строка кончается на #0 а это не ' '

да, ты прав, ахинею весело читать :)

например
Код: pascal
1.
2.
3.
4.
    str := 'h h h 54           6767         67 rh hhhh';
    str := RepSpToTabs(str);
    str := 'f'+str+'f';
    Writeln(str);


и результат
...
Рейтинг: 0 / 0
Форматирование текста
    #39528752
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguin,

А в чём ахинею с моей стороны ? Нет, с моей нету. Но за баг спасибо.


Я просто не ту переменную воткнул в последнем изменении

Код: pascal
1.
  SetLength(Result, c - 1);



Эти глуппые баги есть у всех. Даже у вас. (А если говорите что нет. То, в двойне)
...
Рейтинг: 0 / 0
Форматирование текста
    #39528761
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикTactical Nuclear Penguin,

А в чём ахинею с моей стороны ? Нет, с моей нету. Но за баг спасибо.


Я просто не ту переменную воткнул в последнем изменении

Код: pascal
1.
  SetLength(Result, c - 1);



Эти глуппые баги есть у всех. Даже у вас. (А если говорите что нет. То, в двойне)

то есть отлаживать на пользователе предлагаете? нуну...
почему в начале пробелы не трогаем а в конце весело удаляем?
задание плохо читали? МЕЖДУ словами
...
Рейтинг: 0 / 0
Форматирование текста
    #39528771
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик, у всех бывают ошибки. Но у многих пафоса меньше.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528775
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tactical Nuclear Penguinто есть отлаживать на пользователе предлагаете? нуну...


Я и отладил по быстрому, только как на зло. Последнюю строку не просмотрел. По этому и не нашёл ничего такого..

Tactical Nuclear Penguinпочему в начале пробелы не трогаем а в конце весело удаляем?

Кхм, сейчас - заведём первый цикл, в котором найдём чистую длину строки. Выделим строку, и снова пойдём резать лишние пробелы.

Операция очень сильно усложняется для процессора. Ему легче выделить, и уменьшить строку. Это во много быстрее.



makhaonНяшик, у всех бывают ошибки. Но у многих пафоса меньше.

Потому что, все накинулись зассирать - увидев, что я не приверженец стандартного функционала.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528778
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как решить проблеммку.
Имеется файл в 40-50-100 тысяч строк.
Строка формата
С. Л. З. C. В. ЛС Фамилия Имя Отчество Дата Осн. документ Серия, Личный номер Дата Дата Дата рег. по ПрТипДатаДаДата Адрес ЛС

Как можно заменить пробелы между словами на один знак табуляции. Чтобы в результате получить нормально отформатированный текст, который бы разбивался на колонки в Excele(к примеру).

Человеку нужно один файл загрузить в Excel, разовая операция. Для этого нужно пробелы заменить ТАБом, чтобы Excel разбил их по ячейкам. Никакой критичности по времени расчёта нет. Неужели использование двух функций Pos и StringReplace настолько чудовищно, что нужно третью страницу обсуждать ошибки с использованием указателей ?
...
Рейтинг: 0 / 0
Форматирование текста
    #39528779
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЧеловеку нужно один файл загрузить в Excel, разовая операция. Для этого нужно пробелы заменить ТАБом, чтобы Excel разбил их по ячейкам. Никакой критичности по времени расчёта нет. Неужели использование двух функций Pos и StringReplace настолько чудовищно, что нужно третью страницу обсуждать ошибки с использованием указателей ?


Я специально для тебя с указателя переписал на обычную индексацию. Из за этого напоровшись на баг.

Вообще, я хотел показать что код ничем не сложнее получается чем через "Pos и StringReplace"
...
Рейтинг: 0 / 0
Форматирование текста
    #39528789
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код гораздо сложнее для понимания и написания. Как уже выяснилось, чреват множеством подводных камней
...
Рейтинг: 0 / 0
Форматирование текста
    #39528793
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrКод гораздо сложнее для понимания и написания. Как уже выяснилось, чреват множеством подводных камней

Твой код вообще заменяет два пробела на 1 и потом, 1 пробел на #9


А тс - у надо между слов

Давай - реализовывай, и посмотрим что код увеличиться ещё.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528806
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой код делает ровно то что нужно ТС
...
Рейтинг: 0 / 0
Форматирование текста
    #39528807
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для более точной задачи немешало бы убрать #9 с начала строки
...
Рейтинг: 0 / 0
Форматирование текста
    #39528809
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикТвой код вообще заменяет два пробела на 1 и потом, 1 пробел на #9
А тс - у надо между слов
Если в строке 10 пробелов подряд, то путём замены ДВУХ подряд на ОДИН, рано или поздно мы получим всего ОДИН пробел.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528814
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

Попробовал твой код. Мол. Ну, посмотреть как он работает - раз ты утверждаешь что ровно. И вижу фигу



...

А вообще. Если я уберу флаг bool в своём коде. То примерно будет тоже самое что я думал. Но у тебя код не рабочий.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, Classes;


function Test(_File: string): string;
var
  SL: TStringList;
  S: string;
  i, j: Integer;
begin
  SL := TStringList.Create;
  SL.LoadFromFile(_File);
  for i := 0 to SL.Count - 1 do
  begin
    S := SL[i];
    repeat
      j := Pos('  ', S);
      if j > 0 then
        S := StringReplace(S, '  ', ' ', [rfReplaceAll]);
    until j = 0;
    SL[j] := StringReplace(S, ' ', #9, [rfReplaceAll]);
  end;
  Result := SL.Text;
end;

var
  str: string;

begin
  try
    Writeln(Test('D:\567567.txt'));
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

...
Рейтинг: 0 / 0
Форматирование текста
    #39528817
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст из файла

Код: sql
1.
2.
               С.    Л.    З.    C.    В. ЛС               Фамилия         Имя            Отчество          Дата        Осн. документ
Серия,       Личный номер       Дата         Дата  Дата рег. по ПрТипДатаДаДата        Адрес ЛС
...
Рейтинг: 0 / 0
Форматирование текста
    #39528819
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оо. Я понял в чём ты ошибку сделал..

Ты даже в таком "простом" коде накосячил.

Так что 1 \ 1
...
Рейтинг: 0 / 0
Форматирование текста
    #39528822
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, вот твой код такой такой результат




Я такой результат могу и так добится
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
function RepSpToTabs(const str: string): string;
var
  l, r, c: Integer;
begin
  l := Length(str);
  SetLength(Result, l);

  r := 1;
  c := 1;
  while r <= l do
  begin
    if (str[r] = ' ') and (str[r + 1] = ' ') then
    begin
      Result[c] := #$9;
      inc(r, 2);
      while str[r] = ' ' do
        inc(r);
    end
    else
    begin
      Result[c] := str[r];
      inc(r);
    end;
    inc(c);
  end;
  SetLength(Result, c - 1);
end;



Как ты выразился, а #9 можно и убрать сначала строки .. Хотя тот мой код это делает по умолчанию
...
Рейтинг: 0 / 0
Форматирование текста
    #39528826
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой код написан без всяких отладчиков, и даже без среды, просто "на коленке".
Поэтому вполне естественно что вместо S[i] написал S[j].
...
Рейтинг: 0 / 0
Форматирование текста
    #39528828
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrМой код написан без всяких отладчиков, и даже без среды, просто "на коленке".
Поэтому вполне естественно что вместо S[i] написал S[j].

Ну ок. А я код тоже пишу просто так. Ток потом запускаю посмотреть результаты.

А ты даёшь код, и не проверяешь. Притом уверяешь что он на 100% верный.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528830
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нигде не утверждал, что он на 100% верный. Если человек не сможет разобраться с ошибкой в одной букве, то в твоём коде ему не разобраться НИКОГДА.
...
Рейтинг: 0 / 0
Форматирование текста
    #39528832
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЯ нигде не утверждал, что он на 100% верный. Если человек не сможет разобраться с ошибкой в одной букве, то в твоём коде ему не разобраться НИКОГДА.


Разве ?

DimaBrМой код делает ровно то что нужно ТС

Разве ровно, это не 100? Или у тебя есть у ровно какой - то коэффициент ??
...
Рейтинг: 0 / 0
74 сообщений из 74, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Форматирование текста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]