Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Вырезать символы из строки


Автор: Zwerver 27.10.2011, 14:02
Добрый день! Помогите пожалуйста решить такую проблему.
Есть файл с числами, которые записаны так:
.....
1.2345 5.432 9.8765
0.123 4.5678 3.2567
.....
То есть число1 - пробел - число 2 - пробел - число3
Количество знаков после запятой везде разное, но разделитель всегда только пробел.
Мне нужно переписать их по-другому: число1 из первого столбца - пробел - число 1 из второго столбца - пробел - ... и так далее, то есть отделить столбцы друг от друга.

Для начала я попытался взять хотя бы одну строчку и выделить в ней три подстроки (то есть "вырезать" три числа):

Код

procedure TForm1.Button1Click(Sender: TObject);
var s,s1: string;
    k: integer;
begin

  Memo1.Lines.LoadFromFile('D:\XYZ.txt');

  s:= Memo1.Lines[0];
  s1:='';

  for k:=0 to length(s) do begin

    if(s[k]<>' ') then begin
      s1:=s1+s[k];
    end
    else begin
      Memo2.Lines.Add(s1);
      s1:='';
    end;
    end;

end;


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

Автор: AndreyIQ 27.10.2011, 14:10
Замените
Код

for k:=0 to length(s) do begin

на
Код

for k:=1 to length(s) do begin

Автор: MetalFan 27.10.2011, 15:12
StrUtils.SplitString не подойдет для "распила" строки? зачем велосипед изобретать?

Автор: AndreyIQ 27.10.2011, 15:23
Цитата(MetalFan @ 27.10.2011,  15:12)
StrUtils.SplitString не подойдет для "распила" строки? зачем велосипед изобретать?

Чет не нашел такой функции.

Автор: Zwerver 27.10.2011, 15:32
Спасибо! Ошибка была глупая )

Теперь вроде всё правильно получается, но почему-то в Memo числа выводятся не до конца.

Код

procedure TForm1.Button1Click(Sender: TObject);
var s,s1,Sx,Sy,Sz : string;
    X,Y,Z : string;
    i,j,k,nomerchisla : integer;
    r: real;
begin
  DecimalSeparator:='.';

  Memo1.Lines.LoadFromFile('D:\XYZ.txt');

  X := ''; Y := ''; Z := '';
  i:=0;
  j:=0;

  while(i <= Memo1.Lines.Count) do begin

    Inc(j);
    Label1.Caption:=IntToStr(j);

    s:= Memo1.Lines[i];
    s1:='';
    nomerchisla:=0;

    for k:=1 to length(s) do begin

      if(s[k]<>' ') then
        s1:=s1+s[k]
      else begin
        if (nomerchisla = 0) then begin
          Sx:=FloatToStrF(StrToFloat(s1),ffFixed,4,2);
        end;
        if (nomerchisla = 1) then begin
          Sy:=FloatToStrF(StrToFloat(s1),ffFixed,4,2);
        end;
        if (nomerchisla = 2) then begin
          Sz:=FloatToStrF(StrToFloat(s1),ffFixed,4,2);
        end;
        nomerchisla:=nomerchisla+1;
        s1:='';
      end;
      end;

      X:=X + ' ' + Sx;
      Y:=Y + ' ' + Sy;
      Z:=Z + ' ' + Sz;

      i:=i+15;

  end;

  Memo2.Lines.Add('[' + X + ']');
  Memo3.Lines.Add('[' + Y + ']');
  Memo4.Lines.Add('[' + Z + ']');
end;

Автор: AndreyIQ 27.10.2011, 15:40
Не до конца это как?

Автор: Zwerver 27.10.2011, 15:47
Цитата(AndreyIQ @ 27.10.2011,  15:40)
Не до конца это как?

Например вот - скролл передвинут до конца и в последней строке видно, что число отрезано:
http://s2.ipicture.ru/Gallery/Viewfull/6538225.html

Автор: AndreyIQ 27.10.2011, 16:02
Если верить хелпу
Цитата

Even when MaxLength is 0, there may be limitations imposed by the operating system on the number of characters that may be entered into an edit control

Какой длины у Вас строки в Memo

Автор: Zwerver 27.10.2011, 16:06
Цитата(AndreyIQ @ 27.10.2011,  16:02)
Если верить хелпу
Цитата

Even when MaxLength is 0, there may be limitations imposed by the operating system on the number of characters that may be entered into an edit control

Какой длины у Вас строки в Memo

В MaxLength как раз стоит 0.

Автор: MetalFan 27.10.2011, 16:06
Цитата(AndreyIQ @  27.10.2011,  15:23 Найти цитируемый пост)
Чет не нашел такой функции. 

а она есть! по крайней мере примерно с 2006й делфи.
В модуле StrUtils соответственно.

Автор: AndreyIQ 27.10.2011, 16:14

M
MetalFan
Не к чему цитировать предыдущее сообщение при ответе на него

MetalFan,
У меня 2009.

Добавлено @ 16:29
Цитата(Zwerver @ 27.10.2011,  16:06)
В MaxLength как раз стоит 0.

Максимальная длина строки 1024 по крайней мере для XP.

Автор: Zwerver 27.10.2011, 17:07

M
MetalFan
Не к чему цитировать целиком предыдущее сообщение при ответе на него

В принципе это не так важно, можно и в файл сохранить.
Большое спасибо за помощь!

Автор: Zwerver 28.10.2011, 20:53
Теперь возникли небольшие проблемы с выводом в файл.
Если в приведённом ниже коде поменять строчку
Код

Sx:=FloatToStrF(StrToFloat(s1)/15,ffFixed,4,1);

на строчку
Код

Sx:=FloatToStrF(StrToFloat(s1)/15+2,ffFixed,4,1);

(нужно немного скорректировать числа), то в файлы X1.txt, Z1.txt записываются какие-то иероглифы, а в файле Y1 всё нормально. Возможно, дело в том, что в исходном файле столбцы X и Z содержали отрицательные числа, а столбец Y нет? Но разве FloatToStrF не может работать с отрицательными значениями?

Код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var s,s1,Sx,Sy,Sz : string;
    X,Y,Z,XYZ : string;
    i,j,k,nomerchisla : integer;
    F,F1,F2 : TextFile;
begin
  DecimalSeparator:='.';

  Memo1.Lines.LoadFromFile('D:\XYZ.txt');

  X := ''; Y := ''; Z := '';;
  i:=0;
  j:=0;

  while(i <= Memo1.Lines.Count) do begin

    s:= Memo1.Lines[i];
    s1:='';
    nomerchisla:=0;

    for k:=1 to length(s) do begin

      if(s[k]<>' ') then
        s1:=s1+s[k]
      else begin
        if (nomerchisla = 0) then begin
          Sx:=FloatToStrF(StrToFloat(s1)/15,ffFixed,4,1);
        end;
        if (nomerchisla = 1) then begin
          Sy:=FloatToStrF(StrToFloat(s1)/15,ffFixed,4,1);
        end;
        if (nomerchisla = 2) then begin
          Sz:=FloatToStrF(StrToFloat(s1)/15,ffFixed,4,1);
        end;
        nomerchisla:=nomerchisla+1;
        s1:='';
      end;
      end;

      X:=X + ' ' + Sx;
      Y:=Y + ' ' + Sy;
      Z:=Z + ' ' + Sz;

      i:=i+15;

  end;

  AssignFile(F,'D:\X1.txt');
  Rewrite(F);
  Writeln(F,X);
  CloseFile(F);

  AssignFile(F1,'D:\Y1.txt');
  Rewrite(F1);
  Writeln(F1,Y);
  CloseFile(F1);

  AssignFile(F2,'D:\Z1.txt');
  Rewrite(F2);
  Writeln(F2,Z);
  CloseFile(F2);

end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)