Ads by Google

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--:--  |  スポンサー広告  |  EDIT  |  Top↑
2008.10.28 (Tue)

複数行版Values

文字列リストTStringListには

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(ここら辺は適当に)

テーマ : プログラミング - ジャンル : コンピュータ

14:08  |  文字列処理  |  EDIT  |  Top↑
2008.04.26 (Sat)

1行存在確認

【NYLineExists】

あるからある文字列をし、それをストックしておくという作業をしている際に、同一の文字列の抽出を排除したいという場合があります。

例えばとか。

テキストから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;

の様に使います。文字列があれば何もせず、文字列がなければ追加して戻ってくるというの関数になります。

多分こんな感じかなと。

テーマ : プログラミング - ジャンル : コンピュータ

タグ : テキスト URL リンク ファイル 重複 抽出 ほったらかし

15:46  |  文字列処理  |  EDIT  |  Top↑

Google
 | HOME | 

フリーエリア

RSSフィード

リンク

By FC2ブログ