View Full Version : تفکیک یک رشته ای که با یک کاراکتر خاص جداشده است
  
msoleiman
دوشنبه 09 خرداد 1390, 21:13 عصر
سلام به اساتید محترم
اولا هر چقدر جستجو کردم جوابی برای این سوالم پیدا نکردم که تاپیک جدید زدم و اما سوال و مشکل من :
یک رشته استرینگ از داخل یک فایل INI خوانده میشود که این رشته به صورت 
ABC_DEF_GHI  میباشد که من میخواهم abc را در دیتابیس ذخیره کنم بعد DEF و در نهایت GHI را 
خواهش میکنم راهنمایی فرمایید 
با احترام و تشکر
BORHAN TEC
دوشنبه 09 خرداد 1390, 21:20 عصر
می توانید با دستور copy این کار را انجام دهید.
msoleiman
دوشنبه 09 خرداد 1390, 21:23 عصر
عزیز دل ممنون از پاسختان ولی من تعداد کاراکترهایی خوانده شده را ندارم که بتوانم تفکیک کنم گاهی یکی چهار حرفی گاهی پنج حرفی
Mask
دوشنبه 09 خرداد 1390, 22:09 عصر
شما بايد كاركتر به كاركتر حروف رو بررسي كنيد.(تو يه حلقه FOR) وقتي به كاركتر - رسيديد با دستور copy استرينگ مورد نظر رو جدا كنيد و در بانك بريزيد.
vcldeveloper
سه شنبه 10 خرداد 1390, 08: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, 23:43 عصر
StrUtils.SplitString هم.
M_Maskout
چهارشنبه 11 خرداد 1390, 10: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, 10: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, 16: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, 21: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, 12: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;
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.