Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вырезать символы из строки 
:(
    Опции темы
Zwerver
Дата 27.10.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.10.2011

Репутация: нет
Всего: нет



Добрый день! Помогите пожалуйста решить такую проблему.
Есть файл с числами, которые записаны так:
.....
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;


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

Это сообщение отредактировал(а) Zwerver - 27.10.2011, 14:03
PM MAIL   Вверх
AndreyIQ
Дата 27.10.2011, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



Замените
Код

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

на
Код

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

PM MAIL   Вверх
MetalFan
Дата 27.10.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



StrUtils.SplitString не подойдет для "распила" строки? зачем велосипед изобретать?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
AndreyIQ
Дата 27.10.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



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

Чет не нашел такой функции.
PM MAIL   Вверх
Zwerver
Дата 27.10.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.10.2011

Репутация: нет
Всего: нет



Спасибо! Ошибка была глупая )

Теперь вроде всё правильно получается, но почему-то в 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;


Это сообщение отредактировал(а) Zwerver - 27.10.2011, 15:33
PM MAIL   Вверх
AndreyIQ
Дата 27.10.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



Не до конца это как?
PM MAIL   Вверх
Zwerver
Дата 27.10.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.10.2011

Репутация: нет
Всего: нет



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

Например вот - скролл передвинут до конца и в последней строке видно, что число отрезано:
user posted image
PM MAIL   Вверх
AndreyIQ
Дата 27.10.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



Если верить хелпу
Цитата

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
PM MAIL   Вверх
Zwerver
Дата 27.10.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.10.2011

Репутация: нет
Всего: нет



Цитата(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.
PM MAIL   Вверх
MetalFan
Дата 27.10.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
AndreyIQ
Дата 27.10.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8




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

MetalFan,
У меня 2009.

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

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

Это сообщение отредактировал(а) MetalFan - 27.10.2011, 18:32
PM MAIL   Вверх
Zwerver
Дата 27.10.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.10.2011

Репутация: нет
Всего: нет




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

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

Это сообщение отредактировал(а) MetalFan - 27.10.2011, 18:32
PM MAIL   Вверх
Zwerver
Дата 28.10.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.10.2011

Репутация: нет
Всего: нет



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

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;


Это сообщение отредактировал(а) Zwerver - 28.10.2011, 20:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.