2008.10.28 (Tue)
複数行版Values
文字列リストTStringListには
Key=Value
形式で文字列を保存するプロパティがあります。しかし、これは
改行コードが入ると期待した動作をしてくれません。なので、
これを複数行バージョンにします。
といっても難しいことはせずに簡単に済ませます。
承継して新しいプロパティを追加すれば良いんでしょうが、
よく分からないので、ワタクシは内包する形にしました。
ここら辺はお好きなように。
単純にValuesプロパティの部分を
こんな感じにしただけです。
・MyListは内包するTStringListクラス。
・CRLFは改行コード#13#10
・CRLFCodeは改行コードの変換後文字列。#9'CRLF'#9(ここら辺は適当に)
Key=Value
形式で文字列を保存するプロパティがあります。しかし、これは
改行コードが入ると期待した動作をしてくれません。なので、
これを複数行バージョンにします。
といっても難しいことはせずに簡単に済ませます。
承継して新しいプロパティを追加すれば良いんでしょうが、
よく分からないので、ワタクシは内包する形にしました。
ここら辺はお好きなように。
単純にValuesプロパティの部分を
function FGetValues(Key:string):string;
begin
Result:=MyList.Values[ID];
Result:=StringReplace(Result,CRLFCode,CRLF,[rfReplaceAll]);
end;
procedure FSetValues(Key,Val:string);
begin
MyList.Values[ID]:=StringReplace(Value,CRLF,CRLFCode,[rfReplaceAll]);
end;
こんな感じにしただけです。
・MyListは内包するTStringListクラス。
・CRLFは改行コード#13#10
・CRLFCodeは改行コードの変換後文字列。#9'CRLF'#9(ここら辺は適当に)
2008.04.26 (Sat)
1行存在確認
【NYLineExists】
あるテキストからある文字列を抽出し、それをストックしておくという作業をしている際に、同一の文字列の抽出を排除したいという場合があります。
例えばリンクURLとか。
テキストファイルからURLを抽出して、その中にあるURLを列挙するという場合、目的としては抜き出したURLは重複して欲しくないわけで、重複を排除する必要が出てきます。
で、こんな場合、僕はTStrings系のクラスを使います。といっても実際はTLightStringsというクラスを使うんですが。
その中にIndexOfというメソッドがあります。そのメソッドを使います。IndexOfというのは同じものがあればその行番号を返すというメソッドですが、これがよろしかろうと。
でもって、重複している文字列がない場合は新しく追加してくれると幸せになれるかも。ということで、そんな関数を作ってみたいと思います。
と、Exists系のメソッドのクセに返す型がintegerとは何事だということですが、自分用なので無問題。
引数は文字列を保存しておくTLightStrings、確認対象文字列、追加モードとなっています。追加モードは文字列が存在しない場合に追加するというモードです。
戻り値が-1なら不存在。追加モードがTrueならば、追加してExitします。存在する場合は存在するインデックスを戻してきます。で、
if NYLineExists(LS,Str)<>-1 then continue;
の様に使います。文字列があれば何もせず、文字列がなければ追加して戻ってくるというほったらかしの関数になります。
多分こんな感じかなと。
あるテキストからある文字列を抽出し、それをストックしておくという作業をしている際に、同一の文字列の抽出を排除したいという場合があります。
例えばリンクURLとか。
テキストファイルからURLを抽出して、その中にあるURLを列挙するという場合、目的としては抜き出したURLは重複して欲しくないわけで、重複を排除する必要が出てきます。
で、こんな場合、僕はTStrings系のクラスを使います。といっても実際はTLightStringsというクラスを使うんですが。
その中にIndexOfというメソッドがあります。そのメソッドを使います。IndexOfというのは同じものがあればその行番号を返すというメソッドですが、これがよろしかろうと。
でもって、重複している文字列がない場合は新しく追加してくれると幸せになれるかも。ということで、そんな関数を作ってみたいと思います。
function NYLineExists(LS:TLightStrings;Str:string;AddFlag:boolean=True):integer;
begin
//存在チェック
Result:=LS.IndexOf(Str);
//追加モードでなければExit
if not AddFlag then exit;
//追加モードで、存在しなければ追加
if Result=-1 then LS.Add(Str);
end;
と、Exists系のメソッドのクセに返す型がintegerとは何事だということですが、自分用なので無問題。
引数は文字列を保存しておくTLightStrings、確認対象文字列、追加モードとなっています。追加モードは文字列が存在しない場合に追加するというモードです。
戻り値が-1なら不存在。追加モードがTrueならば、追加してExitします。存在する場合は存在するインデックスを戻してきます。で、
if NYLineExists(LS,Str)<>-1 then continue;
の様に使います。文字列があれば何もせず、文字列がなければ追加して戻ってくるというほったらかしの関数になります。
多分こんな感じかなと。
| HOME |



