ডিলিমিটারের ভিত্তিতে একটি স্ট্রিংকে স্ট্রিংয়ের অ্যারেতে বিভক্ত করুন


85

আমি একটি ডেলফি ফাংশন সন্ধান করার চেষ্টা করছি যা একটি ডিলিমিটারের ভিত্তিতে একটি ইনপুট স্ট্রিংটিকে স্ট্রিংয়ের অ্যারেগুলিতে বিভক্ত করবে। আমি গুগলে অনেক কিছু পেয়েছি, তবে সবার মনে হচ্ছে তাদের নিজস্ব সমস্যা আছে এবং আমি তাদের কোনওটিকেই কাজ করতে সক্ষম করতে সক্ষম হইনি।

আমাকে কেবল একটি স্ট্রিংটি "word:doc,txt,docx"':' এর উপর ভিত্তি করে একটি অ্যারেতে বিভক্ত করতে হবে । ফলাফল হবে ['word', 'doc,txt,docx']

কারও কি এমন ফাংশন আছে যা তারা জানে?

ধন্যবাদ

উত্তর:


87

আপনি স্ট্রিংকে বিভক্ত করার জন্য TStrings.DelimitedText বৈশিষ্ট্যটি ব্যবহার করতে পারেন

এই নমুনা পরীক্ষা করুন

program Project28;

{$APPTYPE CONSOLE}

uses
  Classes,
  SysUtils;

procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
   ListOfStrings.Clear;
   ListOfStrings.Delimiter       := Delimiter;
   ListOfStrings.StrictDelimiter := True; // Requires D2006 or newer.
   ListOfStrings.DelimitedText   := Str;
end;


var
   OutPutList: TStringList;
begin
   OutPutList := TStringList.Create;
   try
     Split(':', 'word:doc,txt,docx', OutPutList) ;
     Writeln(OutPutList.Text);
     Readln;
   finally
     OutPutList.Free;
   end;
end.

হালনাগাদ

এর ব্যাখ্যার জন্য এই লিঙ্কটি দেখুন StrictDelimiter


22
দুর্ভাগ্যক্রমে অনেকগুলি "পুরানো" ডেল্ফি সংস্করণগুলিতে একটি বাগ রয়েছে (কোনটি প্রকাশের সাথে এটি স্থির হয়েছিল তা নিশ্চিত নয়) যা স্পেস অক্ষরটিকে সর্বদা ডিলিমিটার হিসাবে ব্যবহার করে। তাই যত্ন সহকারে এটি পরিচালনা করুন !!
লিও

16
হ্যাঁ আপনি স্ট্রাইকডেলিমিটারকে সত্যে সেট করতে চাইবেন, এবং যদি আপনার ডেলফির সংস্করণে স্ট্রাইকডেলিমিটারের সম্পত্তি পাওয়া না যায় তবে এই কৌশলটি ব্যবহার করবেন না! তবে যদি এটি হয় তবে এটি খুব দরকারী।
ম্যাসন হুইলারের

4
এটি কোনও বাগ ছিল না, এটি ডি 1 বা ডি 2 এর পিছনে একটি (বিরক্তিকর) নকশার সিদ্ধান্ত ছিল। কোমা টেক্সট কোট সহ ফাঁকা স্থানের কোনও ক্ষেত্র আবদ্ধ করার কথা ছিল। যদি ইনপুটটিতে শূন্যস্থান সহ যে কোনও ক্ষেত্রের চারদিকে ডাবল উক্তি থাকে তবে ফলাফলটি সঠিক।
গেরি কল

4
আমার পোষা প্রাণীগুলির মধ্যে একটি হল যখন লোকেরা অকারণে পরিবর্তনশীল / পরামিতি নামগুলিতে টাইপ সূচক রাখে। পাস্কাল দৃ strongly়ভাবে টাইপ করা হয় - এটি রিন্ডান্ট টাইপিং (আঙুলের অনুশীলনের বিভিন্ন ধরণের) এবং টাইপ সূচকটি ভুল হলে বিভ্রান্তিকরভাবে বিভ্রান্ত হয়: যেমন অ্যারেঅফসস্ট্রিংস কোনও অ্যারে নয় (এবং যেমন প্রশ্নের উত্থাপিত প্রশ্নের উত্তর দেয় না) ।
ডেলিক্স

6
প্রত্যেকের জন্য এই উত্তরটি upvoting, দয়া করে নোট করুন যে এটি একটি অ্যারে উত্পাদন করে না, যেমন প্রশ্নে উল্লিখিত হয়েছে। অসম্পূর্ণ প্রয়োজনীয়তাগুলির স্পেসিফিকেশন এই শিল্পে একটি বড় সমস্যা, বর্ণিত প্রয়োজনীয়তা উপেক্ষা করা এবং জিজ্ঞাসা করা হয়নি এমন কিছু সরবরাহ করা অন্য একটি বড় সমস্যা। হয় অনুমোদন কেবল খারাপ অভ্যাস উত্সাহ দেয়। ;)
ডেলিক্স

69

কোনও Splitফাংশন ইঞ্জিনিয়ারিংয়ের দরকার নেই । এটি ইতিমধ্যেই রয়েছে, দেখুন: Classes.ExtractStrings

এটি নিম্নলিখিত পদ্ধতিতে ব্যবহার করুন:

program Project1;

{$APPTYPE CONSOLE}

uses
  Classes;

var
  List: TStrings;
begin
  List := TStringList.Create;
  try
    ExtractStrings([':'], [], PChar('word:doc,txt,docx'), List);
    WriteLn(List.Text);
    ReadLn;
  finally
    List.Free;
  end;
end.

এবং প্রশ্নের পুরো উত্তর দিতে; Listউপাদানগুলির সাথে কাঙ্ক্ষিত অ্যারে উপস্থাপন করে:

List[0] = 'word'
List[1] = 'doc,txt,docx'

14
এক্সট্রাক্ট স্ট্রিংসগুলি অত্যন্ত জটিল নয়: "ক্যারেজ রিটার্ন, নতুনলাইন অক্ষর এবং উদ্ধৃতি অক্ষর (একক বা দ্বিগুণ) সর্বদা বিভাজক হিসাবে বিবেচিত হয়।"; এবং "দ্রষ্টব্য: এক্সট্রাক্টস্ট্রিংগুলি তালিকায় খালি স্ট্রিং যুক্ত করে না" "
ভয়ঙ্কর

সমস্যাটি কোনও splitফাংশন ইঞ্জিনিয়ারের নয় , তবে কোনও TStringsসামগ্রীর প্রয়োজন । এবং অবিচ্ছিন্নতার (@ ওমরস) উল্লেখ করার কারণে, আমি ফ্র্যাঙ্কের সমাধানটিকে
ওল্ফ

51

আপনি ব্যবহার করতে পারেন StrUtils.SplitString

function SplitString(const S, Delimiters: string): TStringDynArray;

ডকুমেন্টেশন থেকে এর বিবরণ :

নির্দিষ্ট ডিলিমিটার অক্ষর দ্বারা পৃথক পৃথক অংশে একটি স্ট্রিং বিভক্ত করে।

স্প্লিটস্ট্রিং নির্দিষ্ট ডিলিমিটার অক্ষর দ্বারা বিসর্জনিত বিভিন্ন অংশে একটি স্ট্রিং বিভক্ত করে। এস বিভক্ত হওয়ার স্ট্রিং। ডিলিমিটার হ'ল একটি স্ট্রিং যা ডেলিমিটার হিসাবে সংজ্ঞায়িত অক্ষরগুলি ধারণ করে।

SplitString ধরনের স্ট্রিং একটি অ্যারে ফেরৎ System.Types.TStringDynArray আসল স্ট্রিং এর বিভক্ত অংশের ধারণ করে।


4
হুঁ, আমার ডেলফি ২০১০-এর সংস্করণে নয় (এক্সএমএলডোক এবং (ইন্ডি ইউনিট) আইডিস্ট্রিংগুলিতে একটি স্প্লিটস্ট্রিং রুটিন রয়েছে, তবে পোস্টারটি যা চায় সেটি আর এক্সএমএলডোকের রুটিন কোনওভাবেই ইউনিট ইন্টারফেসের মাধ্যমে প্রকাশিত হয়নি)।
ডেলিক্স

4
ফাংশন স্প্লিটস্ট্রিং (কনস্ট এস, ডিলিমেটারস: স্ট্রিং): টিস্ট্রিংডিনআরে; StrUtils.pas সংজ্ঞায়িত
Alex

আমি স্ট্রুটিলস.পাস (উপস্থিত থাকা অবস্থায়) ফাইল অন্তর্ভুক্ত করতে সক্ষম নই।
ট্রুথসাইকার

এটি একটি স্ট্রিংটিকে "অ্যারে" তে বিভক্ত করার একটি উদাহরণ।
বিভিজে

সর্বোত্তম জিনিসটি হ'ল এটি অন্যান্য উত্তরে চর ডিলিমেটারগুলির বিপরীতে স্ট্রিং ডিলিমিটারকে গ্রহণ করে।
ব্যবহারকারী 30478

42

ডেলফি এক্সই 3 তে প্রবর্তিত সিসটিলস.এসটিআলিং.স্প্লিট ফাংশনটি ব্যবহার করে :

var
  MyString: String;
  Splitted: TArray<String>;
begin
  MyString := 'word:doc,txt,docx';
  Splitted := MyString.Split([':']);
end.

এটি প্রদত্ত ডিলিমিটারের সাথে একটি স্ট্রিংকে একটি স্ট্রিংয়ের অ্যারে বিভক্ত করবে।


19

আমি সর্বদা এর মতো কিছু ব্যবহার করি:

Uses
   StrUtils, Classes;

Var
  Str, Delimiter : String;
begin
  // Str is the input string, Delimiter is the delimiter
  With TStringList.Create Do
  try
    Text := ReplaceText(S,Delim,#13#10);

    // From here on and until "finally", your desired result strings are
    // in strings[0].. strings[Count-1)

  finally
    Free; //Clean everything up, and liberate your memory ;-)
  end;

end;

4
পুরানো ডেলফি সংস্করণ ব্যবহারকারীদের জন্য দুর্দান্ত সমাধান।
ওল্ফ

সি ++ বিল্ডার 6 জন ব্যবহারকারী: সংশ্লিষ্ট ফাংশনটি হলStrutils::AnsiReplaceText
ওল্ফ

আশ্চর্যজনকভাবে সহজ। সঙ্গে ডেল্ফী 7 ওয়ার্কিং: list.Text := AnsiReplaceStr(source, delimiter, #13#10);
আলাইনড

ডেল্ফিতে 6 সিসটিলগুলি ব্যবহার করতে পারে ring স্ট্রিংরেসপ্লেস
পাইফেক

16

মেফের দ্বারা প্রদত্ত বিস্ফোরণ () ফাংশনের অনুরূপ , তবে বেশ কয়েকটি পার্থক্যের সাথে (যার মধ্যে আমি একটি বাগ ফিক্স বিবেচনা করি):

  type
    TArrayOfString = array of String;


  function SplitString(const aSeparator, aString: String; aMax: Integer = 0): TArrayOfString;
  var
    i, strt, cnt: Integer;
    sepLen: Integer;

    procedure AddString(aEnd: Integer = -1);
    var
      endPos: Integer;
    begin
      if (aEnd = -1) then
        endPos := i
      else
        endPos := aEnd + 1;

      if (strt < endPos) then
        result[cnt] := Copy(aString, strt, endPos - strt)
      else
        result[cnt] := '';

      Inc(cnt);
    end;

  begin
    if (aString = '') or (aMax < 0) then
    begin
      SetLength(result, 0);
      EXIT;
    end;

    if (aSeparator = '') then
    begin
      SetLength(result, 1);
      result[0] := aString;
      EXIT;
    end;

    sepLen := Length(aSeparator);
    SetLength(result, (Length(aString) div sepLen) + 1);

    i     := 1;
    strt  := i;
    cnt   := 0;
    while (i <= (Length(aString)- sepLen + 1)) do
    begin
      if (aString[i] = aSeparator[1]) then
        if (Copy(aString, i, sepLen) = aSeparator) then
        begin
          AddString;

          if (cnt = aMax) then
          begin
            SetLength(result, cnt);
            EXIT;
          end;

          Inc(i, sepLen - 1);
          strt := i + 1;
        end;

      Inc(i);
    end;

    AddString(Length(aString));

    SetLength(result, cnt);
  end;

পার্থক্য:

  1. aMax পরামিতি স্ট্রিংগুলির সংখ্যার সীমাবদ্ধ করে
  2. যদি ইনপুট স্ট্রিংটি কোনও বিভাজক দ্বারা বন্ধ করা হয় তবে নামমাত্র "খালি" চূড়ান্ত স্ট্রিংটি বিদ্যমান বলে মনে করা হয়

উদাহরণ:

SplitString(':', 'abc') returns      :    result[0]  = abc

SplitString(':', 'a:b:c:') returns   :    result[0]  = a
                                          result[1]  = b
                                          result[2]  = c
                                          result[3]  = <empty string>

SplitString(':', 'a:b:c:', 2) returns:    result[0]  = a
                                          result[1]  = b

এটি আমি অনুসরণযোগ্য বিভাজক এবং ধারণা "খালি চূড়ান্ত উপাদান" যা আমি বাগ ফিক্স বিবেচনা করি।

আমি প্রস্তাবিত মেমরি বরাদ্দ পরিবর্তনের সাথে সংশোধন করেছি, আমি সংশোধন করে (আমি ভুলভাবে পরামর্শ দিয়েছি ইনপুট স্ট্রিংয়ে প্রায় 50% বিভাজক থাকতে পারে, তবে এটি অবশ্যই 100% বিভাজক স্ট্রিং নিয়ে গঠিত হতে পারে, খালি উপাদানগুলির একটি অ্যারে উত্পাদন করে!)


7

বিস্ফোরণটি হ'ল হাই স্পিড ফাংশন, উত্স আলহরিটম টিএসআরটিংস উপাদান থেকে পান। আমি বিস্ফোরণের জন্য পরবর্তী পরীক্ষাটি ব্যবহার করি: 134217733 বাইট ডেটা বিস্ফোরিত করুন, আমি 19173962 উপাদান, কাজের সময় পাই: 2984 এমএস।

ইমপ্লোড খুব কম গতির ফাংশন, তবে আমি এটি সহজ লিখি।

{ ****************************************************************************** }
{  Explode/Implode (String <> String array)                                      }
{ ****************************************************************************** }
function Explode(S: String; Delimiter: Char): Strings; overload;
var I, C: Integer; P, P1: PChar;
begin
    SetLength(Result, 0);
    if Length(S) = 0 then Exit;
    P:=PChar(S+Delimiter); C:=0;
    while P^ <> #0 do begin
       P1:=P;
       while (P^ <> Delimiter) do P:=CharNext(P);
       Inc(C);
       while P^ in [#1..' '] do P:=CharNext(P);
       if P^ = Delimiter then begin
          repeat
           P:=CharNext(P);
          until not (P^ in [#1..' ']);
       end;
    end;
    SetLength(Result, C);
    P:=PChar(S+Delimiter); I:=-1;
    while P^ <> #0 do begin
       P1:=P;
       while (P^ <> Delimiter) do P:=CharNext(P);
       Inc(I); SetString(Result[I], P1, P-P1);
       while P^ in [#1..' '] do P:=CharNext(P);
       if P^ = Delimiter then begin
          repeat
           P:=CharNext(P);
          until not (P^ in [#1..' ']);
       end;
    end;
end;

function Explode(S: String; Delimiter: Char; Index: Integer): String; overload;
var I: Integer; P, P1: PChar;
begin
    if Length(S) = 0 then Exit;
    P:=PChar(S+Delimiter); I:=1;
    while P^ <> #0 do begin
       P1:=P;
       while (P^ <> Delimiter) do P:=CharNext(P);
        SetString(Result, P1, P-P1);
        if (I <> Index) then Inc(I) else begin
           SetString(Result, P1, P-P1); Exit;
        end;
       while P^ in [#1..' '] do P:=CharNext(P);
       if P^ = Delimiter then begin
          repeat
           P:=CharNext(P);
          until not (P^ in [#1..' ']);
       end;
    end;
end;

function Implode(S: Strings; Delimiter: Char): String;
var iCount: Integer;
begin
     Result:='';
     if (Length(S) = 0) then Exit;
     for iCount:=0 to Length(S)-1 do
     Result:=Result+S[iCount]+Delimiter;
     System.Delete(Result, Length(Result), 1);
end;

4
এটি সংকলন করে না: Stringsএটি কোনও ধরণের নয়।
এনজিএলএন

7
var  
    su  : string;        // What we want split
    si  : TStringList;   // Result of splitting
    Delimiter : string;
    ...
    Delimiter := ';';
    si.Text := ReplaceStr(su, Delimiter, #13#10);

সি তালিকার লাইনে বিভক্ত স্ট্রিং থাকবে।


6

আপনি নিজের ফাংশনটি তৈরি করতে পারেন যা স্ট্রিংয়ের টিআর্রিকে রিটার্ন দেয়:

function mySplit(input: string): TArray<string>;
var
  delimiterSet: array [0 .. 0] of char; 
     // split works with char array, not a single char
begin
  delimiterSet[0] := '&'; // some character
  result := input.Split(delimiterSet);
end;

5

এখানে একটি বিস্ফোরণ ফাংশন একটি বাস্তবায়ন যা অন্যান্য অনেক প্রোগ্রামিং ভাষায় স্ট্যান্ডার্ড ফাংশন হিসাবে পাওয়া যায়:

type 
  TStringDynArray = array of String;

function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; 
var 
  SepLen: Integer; 
  F, P: PChar; 
  ALen, Index: Integer; 
begin 
  SetLength(Result, 0); 
  if (S = '') or (Limit < 0) then Exit; 
  if Separator = '' then 
  begin 
    SetLength(Result, 1); 
    Result[0] := S; 
    Exit; 
  end; 
  SepLen := Length(Separator); 
  ALen := Limit; 
  SetLength(Result, ALen); 

  Index := 0; 
  P := PChar(S); 
  while P^ <> #0 do 
  begin 
    F := P; 
    P := AnsiStrPos(P, PChar(Separator)); 
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); 
    if Index >= ALen then 
    begin 
      Inc(ALen, 5); 
      SetLength(Result, ALen); 
    end; 
    SetString(Result[Index], F, P - F); 
    Inc(Index); 
    if P^ <> #0 then Inc(P, SepLen); 
  end; 
  if Index < ALen then SetLength(Result, Index); 
end; 

নমুনা ব্যবহার:

var
  res: TStringDynArray;
begin
  res := Explode(':', yourString);

4
ফলাফলের দৈর্ঘ্য পরিচালনা / প্রত্যাশার জন্য এই কোডটিতে কিছু অদ্ভুত এবং সম্ভাব্য বিশালভাবে অদক্ষ পছন্দ রয়েছে। ক্রমবর্ধমান ফলাফল অ্যারে বৃদ্ধি করে, মেমরি পুনরায় বরাদ্দ এবং খণ্ডিত হওয়ার সম্ভাবনা বৃদ্ধি পায়। প্রাথমিক দক্ষতা যতটা বড় সেট করা সম্ভব হবে তত বেশি দক্ষতা হ'ল ধরে নেওয়া যাক ইনপুট স্ট্রিং 50% বিভাজক স্ট্রিং = দৈর্ঘ্য (এস) ডিভ (2 * দৈর্ঘ্য (বিভাজক)) নিয়ে গঠিত এবং তারপরে এটির আসল সংখ্যায় সেট করুন আইটেমগুলি হয়ে গেলে 1 বরাদ্দটি একটি একক
কাটা

এছাড়াও আপনি সীমাবদ্ধতার প্যারামিটারের উদ্দেশ্য ব্যাখ্যা করেন না। প্রকৃতপক্ষে ইনপুট স্ট্রিংয়ের অক্ষরগুলির প্রথম "সীমা" # -তে সাবস্ট্রিংগুলি সনাক্তকরণকে সীমাবদ্ধ করে দেখানোর সময় আমি আন্তঃসত্তার সাথে এটি সর্বাধিক সংখ্যক সাবস্ট্রিংগুলি ফেরত পাঠানোর জন্য সেট করেছিলাম expected এটি অর্থহীন বলে মনে হচ্ছে যেহেতু আপনার যদি এটির প্রয়োজন হয় তবে প্রয়োজনীয় স্ট্রিংয়ের একটি অনুলিপি () এর উপরে আপনি কেবল বিস্ফোরণ () পরিচালনা করতে পারেন। সর্বাধিক সংখ্যক সাবস্ট্রিং সেট করতে সীমাবদ্ধতা ব্যবহার করা আরও কার্যকর হবে।
ডেলিক্স

@ ডেল্টিক্স: কেউ দাবি করেনি এটি একটি অত্যন্ত অনুকূলিত ফাংশন, এবং কেউই এর জন্য জিজ্ঞাসা করেনি, তাই আমি আপনার অভিযোগটি কিছুটা বুঝতে পারি না। তবে সম্ভবত আপনি সেই ছেলেদের মধ্যে যারা সমস্ত কিছুকে অনুকূল করেন, প্রয়োজনে বা প্রয়োজন ছাড়াই ...
লিও

4
আমি এমন এক লোক যা অকারণে অদক্ষ কোড না লিখলে পরে অপ্টিমাইজ করার বিষয়ে চিন্তা করুন। এটি কোডটি মিনিট মিনিট বিশ্লেষণ করার এবং কিছু ক্ষুদ্র অপ্টিমাইজেশন সম্ভাবনার সন্ধানের ঘটনা নয়, এটি কেবল একটি সুস্পষ্ট এবং সহজেই মোকাবেলা করা অদক্ষতা: সংক্ষিপ্ত মেমরির বর্ধনীয় বৃদ্ধি যা পরিবর্তে সহজেই প্রাক-বরাদ্দ এবং পরে সংক্ষিপ্ত হতে পারে।
ডেলিক্স

এছাড়াও @ মফ: এবং এটি কোনও অভিযোগ নয়, এটি একটি মন্তব্য, পর্যবেক্ষণ ছিল। তবে আরও গুরুত্বপূর্ণ বিষয়টিতে আপনার কোডটিতে আমি কী কী ত্রুটি বিবেচনা করব তা ধারণ করে (ব্যাখ্যা করার জন্য আমার বিকল্পটি দেখুন)।
ডেলিক্স

5

আমি এই ফাংশনটি লিখেছি যা নির্দিষ্ট ডিলিমিটার দ্বারা পৃথক পৃথক স্ট্রিংগুলির লিঙ্কযুক্ত তালিকাকে দেয়। মডিউল ছাড়া খাঁটি বিনামূল্যে প্যাস্কেল।

Program split_f;

type
    PTItem = ^TItem;
    TItem = record
        str : string;
        next : PTItem;
    end;

var
    s : string;
    strs : PTItem;

procedure split(str : string;delim : char;var list : PTItem);
var
    i : integer;
    buff : PTItem;
begin
    new(list);
    buff:= list;
    buff^.str:='';
    buff^.next:=nil;

    for i:=1 to length(str) do begin
        if (str[i] = delim) then begin
            new(buff^.next);
            buff:=buff^.next;
            buff^.str := '';
            buff^.next := nil;
        end
        else
        buff^.str:= buff^.str+str[i];
    end;
end;

procedure print(var list:PTItem);
var
    buff : PTItem;
begin
    buff := list;
    while buff<>nil do begin
        writeln(buff^.str);
        buff:= buff^.next;
    end;
end;

begin

    s := 'Hi;how;are;you?';

    split(s, ';', strs);
    print(strs);


end.

3

জেডি কোড গ্রন্থাগার বিল্ট-ইন স্প্লিট ফাংশন সহ একটি বর্ধিত স্ট্রিংলিস্ট সরবরাহ করে যা বিদ্যমান পাঠ্য যুক্ত এবং প্রতিস্থাপন উভয়ই সক্ষম। এটি রেফারেন্স-গণনা ইন্টারফেসও সরবরাহ করে। সুতরাং এটি এমনকি পুরানো ডেল্ফি সংস্করণগুলির সাথে ব্যবহার করা যেতে পারে যার কোনও স্প্লিটস্ট্রিংস নেই এবং যত্নবান এবং স্টক টিস্ট্রিংলিস্টের কিছুটা ক্লান্তিকর কাস্টমাইজেশন ছাড়াই কেবলমাত্র নির্দিষ্ট সীমানা ব্যবহারকারীর জন্য ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ দেওয়া লাইনের টেক্সট ফাইল যেমন Dog 5 4 7তাদের ব্যবহার করে পার্স করতে পারে:

var slF, slR: IJclStringList; ai: TList<integer>; s: string; i: integer;
    action: procedure(const Name: string; Const Data: array of integer);

slF := TJclStringList.Create; slF.LoadFromFile('some.txt');
slR := TJclStringList.Create;
for s in slF do begin
    slR.Split(s, ' ', true);
    ai := TList<Integer>.Create;
    try
       for i := 1 to slR.Count - 1 do
           ai.Add(StrToInt(slR[i]));
       action(slR[0], ai.ToArray);
    finally ai.Free; end;
end; 

http://wiki.delphi-jedi.org/wiki/JCL_Help:IJclStringList.Split@string@string@Boolean


3

এই আপনার সমস্যার সমাধান হবে

interface
   TArrayStr = Array Of string;

implementation

function SplitString(Text: String): TArrayStr;
var
   intIdx: Integer;
   intIdxOutput: Integer;
const
   Delimiter = ';';
begin
   intIdxOutput := 0;
   SetLength(Result, 1);
   Result[0] := ''; 

   for intIdx := 1 to Length(Text) do
   begin
      if Text[intIdx] = Delimiter then
      begin
         intIdxOutput := intIdxOutput + 1;
         SetLength(Result, Length(Result) + 1);
      end
      else
         Result[intIdxOutput] := Result[intIdxOutput] + Text[intIdx];
   end;
end;

কোডটি কী করে দয়া করে কিছু ব্যাখ্যা দিতে পারেন? ধন্যবাদ
প্যাকো 30'15

এটি ডিলিমিটার কনস্টের সন্ধান করে পাশের স্ট্রিংয়ের মধ্য দিয়ে চলে, যখন পাওয়া না যায়, অ্যারেতে বর্তমান অবস্থানের সাথে মিলিত হয়, যখন পাওয়া যায়, এটি গতিশীল অ্যারেতে পরবর্তী অবস্থানে চলে যায়
ডেনিস

1

বিভাজনের জন্য আমার প্রিয় কাজ:

procedure splitString(delim: char; s: string; ListOfStrings: TStrings);
var temp: string;
    i: integer;
begin
   ListOfStrings.Clear;
   for i:=1 to length(s) do
    begin
      if s[i] = delim then
        begin
          ListOfStrings.add(temp);
          temp := '';
        end
      else
        begin
          temp := temp + s[i];
          if i=length(s) then
             ListOfStrings.add(temp);
        end;
    end;
    ListOfStrings.add(temp);
end;

4
আপনার
ফাংশনটিতে

4
আপনি যোগ করতে হবে ListOfStrings.add(temp);শেষ আইটেম যোগ করার জন্য লুপ পরে।
rnso

নোটের জন্য ধন্যবাদ, আমি অন্য ব্লকে কোড সম্পাদনা করেছি।
জন বো

0

*

//Basic functionality of a TStringList solves this:


uses Classes  //TStringList 
    ,types    //TStringDynArray
    ,SysUtils //StringReplace()
    ;

....

 //--------------------------------------------------------------------------
 function _SplitString(const s:string; const delimiter:Char):TStringDynArray;
  var sl:TStringList;
      i:integer;
  begin
  sl:=TStringList.Create;

  //separete delimited items by sLineBreak;TStringlist will do the job:
  sl.Text:=StringReplace(s,delimiter,sLineBreak,[rfReplaceAll]);

  //return the splitted string as an array:
  setlength(Result,sl.count);
  for i:=0 to sl.Count-1
   do Result[i]:=sl[i];

  sl.Free;
  end;



//To split a FileName (last item will be the pure filename itselfs):

 function _SplitPath(const fn:TFileName):TStringDynArray;
  begin
  result:=_SplitString(fn,'\');
  end;

*


0

এনজিএলজি উত্তরের ভিত্তি https://stackoverflow.com/a/8811242/6619626 আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:

type
OurArrayStr=array of string;

function SplitString(DelimeterChars:char;Str:string):OurArrayStr;
var
seg: TStringList;
i:integer;
ret:OurArrayStr;
begin
    seg := TStringList.Create;
    ExtractStrings([DelimeterChars],[], PChar(Str), seg);
    for i:=0 to seg.Count-1 do
    begin
         SetLength(ret,length(ret)+1);
         ret[length(ret)-1]:=seg.Strings[i];
    end;
    SplitString:=ret;
    seg.Free;
end;

এটি সমস্ত ডেলফি সংস্করণে কাজ করে।


0

ডেলফি 2010 এর জন্য আপনাকে নিজের স্প্লিট ফাংশন তৈরি করতে হবে।

function Split(const Texto, Delimitador: string): TStringArray;
var
  i: integer;
  Len: integer;
  PosStart: integer;
  PosDel: integer;
  TempText:string;
begin
  i := 0;
  SetLength(Result, 1);
  Len := Length(Delimitador);
  PosStart := 1;
  PosDel := Pos(Delimitador, Texto);
  TempText:=  Texto;
  while PosDel > 0 do
    begin
      Result[i] := Copy(TempText, PosStart, PosDel - PosStart);
      PosStart := PosDel + Len;
      TempText:=Copy(TempText, PosStart, Length(TempText));
      PosDel := Pos(Delimitador, TempText);
      PosStart := 1;
      inc(i);
      SetLength(Result, i + 1);
    end;
  Result[i] := Copy(TempText, PosStart, Length(TempText));
end;

আপনি এটি যেমন উল্লেখ করতে পারেন

type
  TStringArray = array of string;
var Temp2:TStringArray;
Temp1="hello:world";
Temp2=Split(Temp1,':')

0
procedure SplitCSV(S:STRING;out SL:TStringList);
var c,commatext:string;
  a,b,up:integer;
begin
   c:=s.Replace(' ','<SPACE>');   //curate spaces

   //first ocurrence of "
   a:=pos('"',c);
   b:=pos('"',c,a+1);
   if (a>0) and (b>0) then
   begin
     commatext:=commatext+copy(c,0,a-1);
     commatext:=commatext+copy(c,a,b-a+1).Replace(',','<COMMA>');   //curate commas
     up:=b+1;
   end
   else
     commatext:=c;

   //while continue discovering "
   while (a>0) and (b>0) do
   begin
     a:=Pos('"',c,b+1);
     b:=pos('"',c,a+1);
     if (a>0) and (b>0) then
     begin
       commatext:=commatext+copy(c,up,a-up);
       commatext:=commatext+copy(c,a,b-a+1).Replace(',','<COMMA>'); //curate commas
       up:=b+1;
     end;
   end;
   //last piece of text end  
   if up<c.Length then
     commatext:=commatext+copy(c,up,c.Length-up+1);

   //split text using CommaText
   sl.CommaText:=commatext;

   sl.Text:=sl.Text.Replace('<COMMA>',',');   //curate commas
   sl.Text:=sl.Text.Replace('<SPACE>',' ');   //curate spaces
end;

উত্তরগুলি যা সমাধান পরিষ্কারভাবে এবং সংক্ষেপে ব্যাখ্যা করে কেবল কোড-এর চেয়ে অনেক বেশি কার্যকর।
মার্টিনিয়া

0
interface

uses
  Classes;

type
  TStringArray = array of string;

  TUtilStr = class
    class function Split(const AValue: string; const ADelimiter: Char = ';'; const AQuoteChar: Char = '"'): TStringArray; static;
  end;


implementation

{ TUtilStr }

class function TUtilStr.Split(const AValue: string; const ADelimiter: Char; const AQuoteChar: Char): TStringArray;
var
  LSplited: TStringList;
  LText: string;
  LIndex: Integer;
begin
  LSplited := TStringList.Create;
  try
    LSplited.StrictDelimiter := True;
    LSplited.Delimiter := ADelimiter;
    LSplited.QuoteChar := AQuoteChar;
    LSplited.DelimitedText := AValue;

    SetLength(Result, LSplited.Count);
    for LIndex := 0 to LSplited.Count - 1 do
    begin
      Result[LIndex] := LSplited[LIndex];
    end;
  finally
    LSplited.Free;
  end;
end;

end.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.