![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
аналог split
_max_ © (2007-10-29 12:09:00)Добрый день!
Есть файл, состоящий из строк типа:
first line|qweqwe
second line|sadsad
next line|adasd
...
Нужно проанализировать каждую часть строки (разделитель"|"). Самый простой способ - каждую строку загружать в массив, элементами которого будут те сами части. На Перле это сделать просто:
open(а, "<data.txt");
while(<f_r>)
{
@a = split /\|/, $_;
#здесь $a[0] - первая часть, $a[1] - вторая часть
#тоесть, для первой строки $a[0]=first line, $a[1]=qweqwe
А вот как организовать это в Делфи?
Palladin (2007-10-30 09:24:00) [1]в D6 точно нет такого...
Игорь Шевченко (2007-10-29 17:10:00) [2]Palladin © (29.10.07 15:45) [11]
> а в DelimitedText как оказалось подстава с пробелами...
StrictDelimiter := true; // В D2006 по крайней мере. Не далее как сегодня натолкнулся :)
Anatoly Podgoretsky (2007-10-29 15:57:00) [3]Парню нужен ассоциативный массив, из готового вряд ли что подойдет, а написать свой не так уж и сложно.
Palladin (2007-10-29 15:45:00) [4]
> Та по пробелам не разбивает
посмотрел на SetDelimitedText... как все жестоко... :)
> избаловались вы :)
да нет, у меня свой набор рутин :), а в DelimitedText как оказалось подстава с пробелами...
clickmaker (2007-10-29 15:31:00) [5]
> [8] Palladin © (29.10.07 15:28)
избаловались вы :)
это из проекта под Д5
Leonid Troyanovsky (2007-10-29 15:30:00) [6]
> Palladin © (29.10.07 15:28) [8]
> так типа эта...
Та по пробелам не разбивает.
--
Regards, LVT.
Palladin (2007-10-29 15:28:00) [7]
> clickmaker © (29.10.07 13:37) [7]
так типа эта...
List.Delimiter:=Delimiter;
List.DelimitedText:=Line;
clickmaker (2007-10-29 13:37:00) [8]procedure ParseLine(Line: string; Delimiter: char; List: TStrings);
var
i: integer;
s: string;
begin
if List.Count>0 then List.Clear;
s:='';
for i:=1 to Length(Line) do begin
if Line[i]=Delimiter then begin
List.Add(s);
s:='';
end
else
s:=s+Line[i];
end;
if s<>'' then List.Add(s);
end;
_max_ (2007-10-29 13:17:00) [9]
> Function PosFrom(Const s:String;c:Char;p_nFrom:Integer):
> Integer;Var i:Integer;Begin For i:=p_nFrom to Length(s)
> Do If s[i]=c Then Begin Result:=i; Exit;
> End; Result:=0;End;
В принципе тоже вариант.
Спасибо!
_max_ (2007-10-29 13:11:00) [10]
> В Delphi7 есть PosExНу а для прочего - написано же, что
> еще и про Copy надо почитать. Ну и мозги типа тоже применить
> надо, только справки по ним не написано.
Функции pos и copy я знаю, и, как я писал выше, используя только эти функции алгоритм разделения на части, к примеру строки " part1|part2|part3|part4" усложняется, т.к. каждая часть может иметь различное кл-во символов. А вот о PosEx еще не слышал, ща почитаю...
Palladin (2007-10-29 13:09:00) [11]
> Как с помощью pos найти позицию второго символа "|" и т.
> д.?"
вообще страшная сверхзадача, можно и без Pos
Function PosFrom(Const s:String;c:Char;p_nFrom:Integer):Integer;
Var
i:Integer;
Begin
For i:=p_nFrom to Length(s) Do
If s[i]=c Then
Begin
Result:=i;
Exit;
End;
Result:=0;
End;
KSergey (2007-10-29 13:06:00) [12]> _max_ (29.10.07 13:02) [2]
> "Как с помощью pos найти позицию второго символа "|" и т.д.?"
В Delphi7 есть PosEx
Ну а для прочего - написано же, что еще и про Copy надо почитать. Ну и мозги типа тоже применить надо, только справки по ним не написано.
_max_ (2007-10-29 13:02:00) [13]
> Pos + F1Copy + F1
Эти функции конечно можно использовать, но только если каждая строка состоит из двох частей, а вот если три и более, то алгоритм с использованием данных функций усложняется, т.к.: "Как с помощью pos найти позицию второго символа "|" и т.д.?"
Palladin (2007-10-29 12:21:00) [14]Pos + F1
Copy + F1