🐲
[Delphi]文字列の分割を指定した文字列単位で行う
特定のバージョンを明記しているもの以外は Delphi (Community Edition) 10.3.2 で確認済みです。
Classes.TStringList を使う方法
LineBreak プロパティにデリミタとして使いたい文字列を指定することで Strings[Index] から要素を取り出すことができます。
使用例
uses System.Classes;
var
SL: TStringList;
begin
SL := TStringList.Create;
SL.LineBreak := '<>';
SL.Text := '2020/10/08<>23:33:59<>小雨';
Writeln(SL.Strings[0]);
SL.Free;
end;
必ず LineBreak を先に設定してから、区切る対象文字列を Text に代入します。
実行結果
2020/10/08
TStringHelper.Split を使う方法
String 型のレコードヘルパ[1] TStringHelper にある Split メソッドを使うと String 型からメソッドを呼び出す感覚で書けます。
使用例
uses System.SysUtils;
var
Strings: TArray<String>;
Item: String;
begin
Strings := '2020/10/08<>23:33:59<>小雨'.Split(['<>']);
for Item in Strings do begin
Writeln(Item);
end;
end;
Split の第1引数はオープン配列パラメータなので [ ] を書き忘れずに。
デリミタ文字列を複数指定することもできます。
実行結果
2020/10/08
23:33:59
小雨
Split 関数を自分で実装する
Delphi 6 以降で使用可能
uses SysUtils, Classes;
function Split(Text: String; Delimiter: String): TStringList;
var
Index: Integer;
TextLen: Integer;
DelimLen: Integer;
SPos: Integer;
begin
Result := TStringList.Create;
if Text = '' then Exit;
TextLen := Length(Text);
DelimLen := Length(Delimiter);
Index := 1;
SPos := 1;
while Index <= TextLen do begin
if StrLComp(PChar(Text) + Index - 1, PChar(Delimiter), DelimLen) = 0 then begin
Result.Add(Copy(Text, SPos, Index - SPos));
Inc(Index, DelimLen);
SPos := Index;
Continue;
end;
Inc(Index);
end;
Result.Add(Copy(Text, SPos, Index - SPos));
end;
使用例
var
SL: TStringList;
Index: Integer;
begin
SL := Split('2020/10/08<>12:15:33<>曇り', '<>');
for Index := 0 to SL.Count - 1 do begin
Writeln('SL[', Index, '] = ', SL[Index]);
end;
SL.Free;
end;
TStringList を生成するので、使い終わったら Free する必要があります。
実行結果
SL[0] = 2020/10/08
SL[1] = 12:15:33
SL[2] = 曇り
-
既存のレコード型(構造体)やプリミティブ型にメソッドを追加することができる機能 ↩︎
Discussion