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

Откуда: Москва
Сообщений: 2206
[quot Няшик]schi,

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

Если только после слова. Чем твой код плох - из него ничего нельзя понять.
29 сен 17, 22:29    [20832719]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
schi
Если только после слова. Чем твой код плох - из него ничего нельзя понять.


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

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;



Ай - как сложно
29 сен 17, 22:37    [20832730]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
SimplTsar
Member

Откуда:
Сообщений: 39
Няшик
      while str[r] = ' ' do // Есть ещё пробелы ? Долой их!
        inc(r); 


отсутсвие проверки Length(str) при удачном сочетании данных - бесконечный цикл или Access Violation
29 сен 17, 23:34    [20832846]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
SimplTsar,

Весело такую Ахинею читать))), при условии r <= l. И при том, что строка кончается на #0 а это не ' '
30 сен 17, 00:34    [20832936]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2362
Няшик
SimplTsar,

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


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

например
    str := 'h h h 54           6767         67 rh hhhh';
    str := RepSpToTabs(str);
    str := 'f'+str+'f';
    Writeln(str);

и результат

К сообщению приложен файл. Размер - 25Kb
30 сен 17, 05:06    [20833014]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
Tactical Nuclear Penguin,

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


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

  SetLength(Result, c - 1);


Эти глуппые баги есть у всех. Даже у вас. (А если говорите что нет. То, в двойне)
30 сен 17, 09:48    [20833094]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2362
Няшик
Tactical Nuclear Penguin,

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


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

  SetLength(Result, c - 1);


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


то есть отлаживать на пользователе предлагаете? нуну...
почему в начале пробелы не трогаем а в конце весело удаляем?
задание плохо читали? МЕЖДУ словами
30 сен 17, 10:22    [20833112]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 1866
Няшик, у всех бывают ошибки. Но у многих пафоса меньше.
30 сен 17, 11:20    [20833159]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
Tactical Nuclear Penguin
то есть отлаживать на пользователе предлагаете? нуну...


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

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


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

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



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


Потому что, все накинулись зассирать - увидев, что я не приверженец стандартного функционала.
30 сен 17, 11:36    [20833169]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

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

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


Человеку нужно один файл загрузить в Excel, разовая операция. Для этого нужно пробелы заменить ТАБом, чтобы Excel разбил их по ячейкам. Никакой критичности по времени расчёта нет. Неужели использование двух функций Pos и StringReplace настолько чудовищно, что нужно третью страницу обсуждать ошибки с использованием указателей ?
30 сен 17, 12:00    [20833199]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
DimaBr
Человеку нужно один файл загрузить в Excel, разовая операция. Для этого нужно пробелы заменить ТАБом, чтобы Excel разбил их по ячейкам. Никакой критичности по времени расчёта нет. Неужели использование двух функций Pos и StringReplace настолько чудовищно, что нужно третью страницу обсуждать ошибки с использованием указателей ?



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

Вообще, я хотел показать что код ничем не сложнее получается чем через "Pos и StringReplace"
30 сен 17, 12:02    [20833204]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
Код гораздо сложнее для понимания и написания. Как уже выяснилось, чреват множеством подводных камней
30 сен 17, 12:33    [20833261]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
DimaBr
Код гораздо сложнее для понимания и написания. Как уже выяснилось, чреват множеством подводных камней


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


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

Давай - реализовывай, и посмотрим что код увеличиться ещё.
30 сен 17, 12:47    [20833287]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
Мой код делает ровно то что нужно ТС
30 сен 17, 14:05    [20833365]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
Для более точной задачи немешало бы убрать #9 с начала строки
30 сен 17, 14:07    [20833366]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
Няшик
Твой код вообще заменяет два пробела на 1 и потом, 1 пробел на #9
А тс - у надо между слов

Если в строке 10 пробелов подряд, то путём замены ДВУХ подряд на ОДИН, рано или поздно мы получим всего ОДИН пробел.
30 сен 17, 14:09    [20833370]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
DimaBr,

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

+
Картинка с другого сайта.


...

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

+
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.
30 сен 17, 14:23    [20833382]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
Текст из файла

               С.    Л.    З.    C.    В. ЛС               Фамилия         Имя            Отчество          Дата        Осн. документ
Серия,       Личный номер       Дата         Дата  Дата рег. по ПрТипДатаДаДата        Адрес ЛС
30 сен 17, 14:29    [20833388]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
Оо. Я понял в чём ты ошибку сделал..

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

Так что 1 \ 1
30 сен 17, 14:32    [20833392]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
Короче, вот твой код такой такой результат

Картинка с другого сайта.


Я такой результат могу и так добится
+
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 можно и убрать сначала строки .. Хотя тот мой код это делает по умолчанию
30 сен 17, 14:42    [20833395]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
Мой код написан без всяких отладчиков, и даже без среды, просто "на коленке".
Поэтому вполне естественно что вместо S[i] написал S[j].
30 сен 17, 15:03    [20833402]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
DimaBr
Мой код написан без всяких отладчиков, и даже без среды, просто "на коленке".
Поэтому вполне естественно что вместо S[i] написал S[j].


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

А ты даёшь код, и не проверяешь. Притом уверяешь что он на 100% верный.
30 сен 17, 15:07    [20833404]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
DimaBr
Member

Откуда:
Сообщений: 10211
Я нигде не утверждал, что он на 100% верный. Если человек не сможет разобраться с ошибкой в одной букве, то в твоём коде ему не разобраться НИКОГДА.
30 сен 17, 15:11    [20833407]     Ответить | Цитировать Сообщить модератору
 Re: Форматирование текста  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 720
DimaBr
Я нигде не утверждал, что он на 100% верный. Если человек не сможет разобраться с ошибкой в одной букве, то в твоём коде ему не разобраться НИКОГДА.



Разве ?

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


Разве ровно, это не 100? Или у тебя есть у ровно какой - то коэффициент ??
30 сен 17, 15:16    [20833413]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Delphi Ответить