PDA

View Full Version : تفکیک یک رشته ای که با یک کاراکتر خاص جداشده است



msoleiman
دوشنبه 09 خرداد 1390, 20:13 عصر
سلام به اساتید محترم
اولا هر چقدر جستجو کردم جوابی برای این سوالم پیدا نکردم که تاپیک جدید زدم و اما سوال و مشکل من :
یک رشته استرینگ از داخل یک فایل INI خوانده میشود که این رشته به صورت
ABC_DEF_GHI میباشد که من میخواهم abc را در دیتابیس ذخیره کنم بعد DEF و در نهایت GHI را
خواهش میکنم راهنمایی فرمایید
با احترام و تشکر

BORHAN TEC
دوشنبه 09 خرداد 1390, 20:20 عصر
می توانید با دستور copy این کار را انجام دهید.

msoleiman
دوشنبه 09 خرداد 1390, 20:23 عصر
عزیز دل ممنون از پاسختان ولی من تعداد کاراکترهایی خوانده شده را ندارم که بتوانم تفکیک کنم گاهی یکی چهار حرفی گاهی پنج حرفی

Mask
دوشنبه 09 خرداد 1390, 21:09 عصر
شما بايد كاركتر به كاركتر حروف رو بررسي كنيد.(تو يه حلقه FOR) وقتي به كاركتر - رسيديد با دستور copy استرينگ مورد نظر رو جدا كنيد و در بانك بريزيد.

vcldeveloper
سه شنبه 10 خرداد 1390, 07:01 صبح
اولا هر چقدر جستجو کردم جوابی برای این سوالم پیدا نکردم که تاپیک جدید زدم
حداقل یکی دو بار خودم در این زمینه اینجا کد گذاشتم؛ کلاس TStringList، خصوصیات DelimitedText و Delimiter موجود در آن:

http://barnamenevis.org/showthread.php?209942-%D9%85%D8%B9%D8%A7%D8%AF%D9%84-%D8%AF%D9%84%D9%81%DB%8C-%DB%8C%DA%A9-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1

SAASTN
سه شنبه 10 خرداد 1390, 22:43 عصر
StrUtils.SplitString هم.

M_Maskout
چهارشنبه 11 خرداد 1390, 09:18 صبح
سلام
از توابع Pos و PosEx استفاده کنید:

(رشته‌ی اصلی , رشته‌ی مورد جستجو)Pos
(مکان در رشته‌ی اصلی , رشته‌ی اصلی , رشته‌ی مورد جستجو)PosEx

رشته‌ی مورد جستجو، رشته یا کارکتریه (در اینجا "_") که که می‌خواین اونو تو رشته‌ی اصلی (در اینجا "ABC_DEF_GHI") جستجو کنید و مکان در رشته‌ی اصلی، موقعیتی هست که از اون موقعیت به بعد رو می‌خواین جستجو کنید.
تابع زیر هر قسمت دلخواه از رشته‌ی دریافت شده از فایل ini رو بر می‌گردونه:

function Get_a_squence(InStr: String; SecNum: Byte): String;
var
SecPos: Byte;
i: Byte;
begin
SecPos := 1;
for i := 1 to SecNum-1 do
SecPos := PosEx('_', InStr, SecPos)+1;
Result := Copy(InStr, SecPos, PosEx('_', InStr, SecPos)-SecPos);
end;

Felony
چهارشنبه 11 خرداد 1390, 09:28 صبح
پست شماره 6 بهترین راه حل هست ، کتابخانه های Strutils و Types رو به Uses اضافه کنید و به صورت زیر ازش استفاده کنید :

دلفی 7 :
var
SpilitedStr: TStringDynArray;
CurrStr: Byte;
begin
SpilitedStr:= SplitString('123-456-789', '-');
for CurrStr:= Low(SpilitedStr) to High(SpilitedStr) do
ShowMessage(SpilitedStr[CurrStr]);
end;

دلفی 2009 به بعد :
var
SpilitedStr: TStringDynArray;
CurrStr: String;
begin
SpilitedStr:= SplitString('123-456-789', '-');
for CurrStr in SpilitedStr do
ShowMessage(CurrStr);
end;

SAASTN
یک شنبه 18 دی 1390, 15:49 عصر
با خبر گشتیم که SplitString از XE به بعد اضافه شده، از اون جایی که الان 2 ساعت داشتم تو 2007 دنبالش می گشتم، کد این تابع برای استفاده در دلفی های پائین تر رو قرار می دم (در واقع کد XE2 رو اینجا Paste می کنم). Types و SysUtils باید Use شن.
function FindDelimiter(const Delimiters, S: string; StartIdx: Integer = 1): Integer;
var
Stop: Boolean;
Len: Integer;
begin
Result := 0;

Len := Length(S);
Stop := False;
while (not Stop) and (StartIdx <= Len) do
if IsDelimiter(Delimiters, S, StartIdx) then
begin
Result := StartIdx;
Stop := True;
end
else
Inc(StartIdx);
end;

function SplitString(const S, Delimiters: string): TStringDynArray;
var
StartIdx: Integer;
FoundIdx: Integer;
SplitPoints: Integer;
CurrentSplit: Integer;
i: Integer;
begin
Result := nil;

if S <> '' then
begin
{ Determine the length of the resulting array }
SplitPoints := 0;
for i := 1 to Length(S) do
if IsDelimiter(Delimiters, S, i) then
Inc(SplitPoints);

SetLength(Result, SplitPoints + 1);

{ Split the string and fill the resulting array }
StartIdx := 1;
CurrentSplit := 0;
repeat
FoundIdx := FindDelimiter(Delimiters, S, StartIdx);
if FoundIdx <> 0 then
begin
Result[CurrentSplit] := Copy(S, StartIdx, FoundIdx - StartIdx);
Inc(CurrentSplit);
StartIdx := FoundIdx + 1;
end;
until CurrentSplit = SplitPoints;

// copy the remaining part in case the string does not end in a delimiter
Result[SplitPoints] := Copy(S, StartIdx, Length(S) - StartIdx + 1);
end;
end;

MohsenB
یک شنبه 18 دی 1390, 20:17 عصر
سلام


براتون یه کد ساده نوشتم :

با این کد میتونید یه رشته رو توسط یک کاراکتر به قسمتهای دلخواه تقسیم کنید . این کد یه کد نمونست ، شما میتونید جای Tstrings نوع دیگری قرار بدین و توی یه نوع ساختار دیگه بریزین و یا بجای اون کد خروجی خدتون رو قرار بدین .


procedure MySplitStr(str :string;rp :Char; var sl :TStrings);
var i :Word;
tmps :string;
begin
tmps:= '';
for i := 1 to Length(str) do
if str[i]<>rp then
tmps:= tmps + str[i]
else begin
sl.Add(tmps); tmps:= '';
end;
sl.Add(tmps); //add last word
end;

procedure TForm1.btn1Click(Sender: TObject);
var l :TStrings;
begin
l:= TStringList.Create; //create
MySplitStr(edt1.Text, '_', l);
lst1.Items.Assign(l);
end; //add data to listbox

موفق باشید

mbshareat
پنج شنبه 22 دی 1390, 11:33 صبح
سلام و خدا قوت
این هم کد ساده برای دستیابی به زیر رشته معین همراه با نحوه استفاده:

Function SubStr(S,SplitChar:string;ItemNo:Variant):String;
var
i,N:Word;
Tmp:String;
begin
tmp:= '';
N:=1;
for i := 1 to Length(S) do
if S[i]=SplitChar then
Inc(N)
else If N=ItemNo Then
tmp:=tmp+S[i];
Result:=Tmp;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(SubStr('ab-CD-G3','-',2));
end;