Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2012, 18:13   #1
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию Не могу найти простейший исходник разделяющий текст

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

Текстовый файл внутри себя содержит такой текст.
Код:
QWERT:12345
EWQRR:SJDKWJAK
FIawIdwa:88w8wwa
AAAAAA:248114
Примерный вид таков.
Jleksern вне форума Ответить с цитированием
Старый 19.04.2012, 18:50   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Код:
while not(Eof(f)) do
begin
  Readln (f, str);
  Memo1.Add(Copy(str, 1, pos(':', str) - 1));
  Memo2.Add(Copy(str, pos(':', str)+1, Length(str) - pos(':', str)))
end;
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 19.04.2012, 19:29   #3
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

можете пожалуйста в проект завернуть, ото у меня ошибки вылетают (delphi7)
Jleksern вне форума Ответить с цитированием
Старый 20.04.2012, 11:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на кнопку "загрузить TXT"
Код:
var ts : TStringList;
  i, k : integer;
  s : string;
begin
  ts := TStringList.Create;
  ts.LoadFromFile('ИмяВашегоФайла.txt');
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
  for i:=0 to ts.Count-1 do  begin
    s := ts.Strings[i];
    k := Pos(':', s);
    if k >1 then begin
        Memo1.Lines.Append(Copy(s, 1, k-1));
        Memo2.Lines.Append(Copy(s,k+1, Length(s)-k ));
     end;
  end;
  ts.Free;
end;
и всё!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.04.2012, 22:06   #5
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

Serge_Bliznykov, блин))) Я Вас люблю ))) спасибо большое ))
Jleksern вне форума Ответить с цитированием
Старый 20.04.2012, 22:45   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Или можно использовать TStringList NameValueSeparator и Name/Values.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.04.2012, 07:18   #7
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

а если использовать
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Или можно использовать TStringList NameValueSeparator и Name/Values.
разница в чем будет проявлять себя ?
Jleksern вне форума Ответить с цитированием
Старый 21.04.2012, 08:44   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Jleksern Посмотреть сообщение
а если использовать

разница в чем будет проявлять себя ?
я не проверял (можете это сделать самостоятельно), но я думаю, что в вашем случае разницы не будет.


p.s. не удивлюсь, если в реализации данного подхода внутри лежат те же самые функции POS и COPY
только их использование скрыто (для удобства использования) от программиста


p.s. посмотрел реализацию в TStrings. Там всё ещё хуже, чем я думал. для Name (GetName()) действительно используется AnsiPos,
но для Value ( GetValue() - используется поиск Name перебором всех строк ).

Код:
function TStrings.GetValue(const Name: string): string;
var
  I: Integer;
begin
  I := IndexOfName(Name);
  if I >= 0 then
    Result := Copy(Get(I), Length(Name) + 2, MaxInt) else
    Result := '';
end;


function TStrings.IndexOfName(const Name: string): Integer;
var
  P: Integer;
  S: string;
begin
  for Result := 0 to GetCount - 1 do
  begin
    S := Get(Result);
    P := AnsiPos(NameValueSeparator, S);
    if (P <> 0) and (CompareStrings(Copy(S, 1, P - 1), Name) = 0) then Exit;
  end;
  Result := -1;
end;
поэтому, на больших (десятки тысяч строк) списках через NameValueSeparator и Name/Value будет работать ЗНАЧИТЕЛЬНО медленнее!

проверку оставляю на совести сомневающихся!

Последний раз редактировалось Serge_Bliznykov; 21.04.2012 в 08:53.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.04.2012, 01:27   #9
Jleksern
Форумчанин
 
Аватар для Jleksern
 
Регистрация: 14.10.2011
Сообщений: 137
По умолчанию

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

По этому решил немного разнообразить и попробовать перевоплатить этот код (с выше) под компонент listbox.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var 
ts : TStringList;
  i, k : integer;
  s : string;
  a: integer;
begin
  ts := TStringList.Create;
    if OpenDialog1.Execute then
  ts.LoadFromFile(OpenDialog1.FileName);
  for i:=0 to ts.Count-1 do  begin
    s := ts.Strings[i];
    k := Pos(edit1.Text, s);
    if k >1 then begin
        Memo1.Lines.Append(Copy(s, 1, k-1));
        Memo2.Lines.Append(Copy(s,k+1, Length(s)-k ));
     end;
  end;
  ts.Free;
  a := Memo1.Lines.Count;
  label5.Caption:=IntToStr(a);
end;
У меня конечно же не получилось именно так как оно выполняется с memo.
При указании на listbox оно либо компилировалось и загружало криво либо вообще не загружало текстовый файл.
Прошу о помощи)) Я хз как правильно переделать и не утратить смысл разделения слов из-за символа.

Jleksern вне форума Ответить с цитированием
Старый 25.04.2012, 02:04   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

о! так Вы за скоростью гонетесь?!
тогда попробуйте такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var 
  ts, ts1, ts2 : TStringList;
  i, k, CountRec : integer;
  s : string;
  a: integer;
begin
  if OpenDialog1.Execute then begin
     ts := TStringList.Create;
     ts1 := TStringList.Create;
     ts2 := TStringList.Create;
     CountRec := 0;
     ts.LoadFromFile(OpenDialog1.FileName);
     for i:=0 to ts.Count-1 do  begin
        s := ts.Strings[i];
        k := Pos(edit1.Text, s);
        if k >1 then begin
           ts1.Append(Copy(s, 1, k-1));
           ts2.Append(Copy(s,k+1, Length(s)-k ));
           inc(CountRec)
        end;
     end;
     ts.Free;
     Memo1.Lines.Text := ts1.Text;
     Memo2.Lines.Text := ts2.Text;
     ts1.Free;
     ts2.Free;
     label5.Caption:=IntToStr(CountRec);
  end;
end;
если хочется использовать ListBox,
тогда замените строчки
Memo1.Lines.Text := ts1.Text;
Memo2.Lines.Text := ts2.Text;

на
Код:
     ListBox1.Items.Text := ts1.Text;
     ListBox2.Items.Text := ts2.Text;

Последний раз редактировалось Serge_Bliznykov; 25.04.2012 в 02:09.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти исходник pascal BeaU Помощь студентам 17 07.02.2012 00:53
Не могу найти исходник программы (которая требует логин и пароль для доступа) makar3000 Софт 0 01.12.2011 16:37
Не могу найти исходник программы (которая требует логин и пароль для доступа) makar3000 БД в Delphi 1 01.12.2011 03:11
Нигде не могу найти исходник проги для создания фоторобота CorruptSoul Свободное общение 2 11.03.2008 15:54
Помогите! Не могу откоректировать исходник!!! DzSoft PHP 1 30.09.2007 17:42