QRBarImageを使用して、宛名ラベルーにカスタマーバーコードの印刷をしたいのですが、漢字かな混じりの住所データからカスタマーバーコードのための文字列を取出す関数がどこかにありませんでしょうか。
関数ではないけど
バーコードに必要な文字情報抜き出し法
http://www.post.japanpost.jp/zipcode/zipmanual/p17.html
描画関連は...
Seizoさんのコンポーネントや
http://www.vector.co.jp/soft/win95/writing/se196641.html
私のユニット
http://homepage1.nifty.com/ht_deko/junkbox.html#BARCODE
を使ってTQRImageに自前で描画する必要があると思います。
# カスタマーバーコードは"日本の"日本郵便(旧郵政省)
# 独自のバーコードですからねぇ...。
郵便事業(株)のホームページにロジックが載っているのは知っていたんですが、どなたかこれをDelphiのプログラムで作成していらっしゃいませんでしょうか。
・番地が漢数字で書かれている場合がある。
・住所に数字が含まれる場合がある。
このため、自動で抜き出すのは不可能とは言いませんが、現実的ではありません。
・住所と番地が分離されている。
・番地は必ず(半角)数字で記述されている。
のであれば、普通に数字を抜き出すだけでいいのですが、
実際にはそううまくはいきません。
# 郵便番号だけのカスタマーバーコードでも受理される事があるようです。
# 一度、問い合わせてみてはいかがでしょうか?
DEKOさんありがとうございます。「現実的ではありません」との忠告ですが、あきらめ切れません。
>あきらめ切れません
久美子さん自身は完璧なものが出来そうな見通しがあるのですか?
http://www.post.japanpost.jp/zipcode/download.html
からダウンロードできる CSV ファイルを使用します
東京都千代田区霞が関1丁目3番2号 郵便プラザ503室
を Edit に入力して実行すると 1000013 が出てきます
*実際には 霞が関(次のビルを除く) になってしまっているので見付かりませんが
最後に S1 に1丁目3番2号 郵便プラザ503室 が入力されるので
数字の抜き出しは自分でやってみてください
全件データから探すと時間がかかるので Edit1 の文字列から都道府県を区別し、読み込む CSV を分ければ処理時間を短く出来ると思います
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,StrUtils, ComCtrls;
type
TFieldData = Record
Data1 : String;
Data2 : String;
Data3 : String;
Data4 : String;
Data5 : String;
Data6 : String;
End;
TForm2 = class(TForm)
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form2: TForm2;
StringList : TStringList;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute = True then
begin
PageControl1.ActivePageIndex := 1;
StringList.LoadFromFile(OpenDialog1.FileName);
Memo2.Lines.Text := StringList.Text;
end;
end;
procedure TForm2.Button2Click(Sender: TObject);
var
I,I2,J,L,L1,L2,L3,FoundLength,FirstIndex,FoundIndex : Integer;
S,S1,S2,S3,SE : String;
B1,B2,Found,Error,EOF : Boolean;
procedure GetData(S:String; var S1,S2,S3 : String; var L1,L2,L3: Integer);
var
J,K,K2,K3,K4 : Integer;
begin
//1行分のデータを取得
K := 0;
for J:=0 to 4 do
begin
K := PosEx('","',S,K+1);
end;
K2 := PosEx('","',S,K +1);
K3 := PosEx('","',S,K2+1);
K4 := PosEx('",' ,S,K3+1);
S1 := Copy(S,K +3,K2-K -3); //都道府県
S2 := Copy(S,K2+3,K3-K2-3); //市町村
S3 := Copy(S,K3+3,K4-K3-3);
L1 := Length(S1);
L2 := Length(S2);
L3 := Length(S3);
end;
function GetZipCode(S:String):String;
var
K2,K3 : Integer;
begin
K2 := PosEx('","',S,1);
K3 := PosEx('","',S,K2+1);
Memo1.Lines.Add (Copy(S,K2+3,K3-K2-3));
end;
begin
Memo1.Lines.Clear;
PageControl1.ActivePageIndex := 0;
SE := Edit1.Text;
I := 0;
FoundIndex := -1;
Error := False;
Found := False;
EOF := False;
while (I < StringList.Count -1) and (EOF = False) do
begin
S := StringList[I];
GetData(S,S1,S2,S3,L1,L2,L3);
if Copy(SE,1,L1+L2) = S1+S2 then
begin
B2 := True;
if B1 = False then
begin
if S3 = '以下に掲載がない場合' then
begin
B1 := True;
FirstIndex := I;
end;
end;
if Copy(SE,1,L1+L2+L3) = S1+S2+S3 then
begin
//一致した
if FoundLength < Length(S1+S2+S3) then
begin
FoundLength := Length(S1+S2+S3);
FoundIndex := I;
end;
Found := True;
end;
end
else
if B2 = True then
begin
//最低1件は見付かっている
if Found = True then
begin
S := StringList[FoundIndex];
GetData(S,S1,S2,S3,L1,L2,L3);
Memo1.Lines.Add ('一致するデータ');
Memo1.Lines.Add(S1+S2+S3);
Memo1.Lines.Add (GetZipCode(S));
EOF := True;
end
else
if B1 = True then
begin
S := StringList[FirstIndex];
GetData(S,S1,S2,S3,L1,L2,L3);
Memo1.Lines.Add ('一致するデータ(以下に掲載が無い場合)');
Memo1.Lines.Add (S1+S2);
Memo1.Lines.Add (GetZipCode(S));
S3 := '';
EOF := True;
end;
end;
Inc(I);
end;
if B2 = True then
begin
Memo1.Lines.Add('残りのデータ');
//残りのデータ
L := Length(S1+S2+S3);
S1 := Copy(SE,L+1,Length(S)-L);
Memo1.Lines.Add(S1);
end
else
begin
Memo1.Lines.Add('見付かりませんでした');
end;
Memo1.Lines.Add('終了');
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
StringList := TStringList.Create;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
StringList.Free;
end;
end.
TFieldData はきにしないで・・・・
三重県四日市市楠町北五味塚六の七 八幡ビル九号棟一〇二 三宮様方
(住所は架空のものです)
...なんて住所があったりしますからね(^^;A
# 京都とかは普通に大変だと思いますが。
...それと、
"登記上の住所と郵便番号の住所が一致しない事がある"ので、
郵便番号の住所を利用できない事があります。
# 大分県の方には心当たりがあるかもしれませんね。
とえあえず
数字だけ抜き出すのは
var
A1 : array[0..9] of String =('0','1','2','3','4','5','6','7','8','9');
A2 : array[0..9] of WideString =('0','1','2','3','4','5','6','7','8','9');
A3 : array[0..9] of WideString =('〇','一','二','三','四','五','六','七','八','九');
Memo1.Lines.Add(S1); 移行に追加
S3 := '';
I := 1;
while I < Length(S) do
begin
K := 0;
S2 := S1;
for J:=0 to 9 do
begin
K := AnsiPos(A1[J],S1);
if K = 1 then
begin
S3 := S3 + A1[J];
S2 := Copy(S1,K+1,Length(S1)-K);
end
else
begin
K := AnsiPos(A2[J],S1);
if K = 1 then
begin
S3 := S3 + A1[J];
S2 := Copy(S1,K+2,Length(S1)-K-2);
end
else
begin
K := AnsiPos(A3[J],S1);
if K = 1 then
begin
S3 := S3 + A1[J];
S2 := Copy(S1,K+2,Length(S1)-K-2);
end
else
begin
S2 := Copy(S1,2,Length(S1)-1);
end;
end;
end;
end;
S1 := S2;
Inc(I);
end;
でS3に入りますが・・・・・・
三重県四日市市楠町北五味塚六の七 八幡ビル九号棟一〇二 三宮様方
でやると
三重県四日市市楠町北五味塚
5100103
六の七 八幡ビル九号棟一〇二 三宮様方
67891023
八幡ビルの 8
三宮様方の 3
も当然はいってしまいます
ここの判断は・・・相当めんどくさそうですが(できるのか?)
流石はKHE00221さん。要点が解ってらっしゃる。
"(以下に掲載がない場合)"な住所に数字が含まれる可能性もありますから、完全自動化は相当面倒です。
> "登記上の住所と郵便番号の住所が一致しない事がある"ので、
これは、郵便番号データに"住所が存在しない事がある"というものです。
この地域の方に郵便番号を聞いて郵便番号データを検索すると違う住所が出てきます(住所<->郵便番号双方向ともに変換できない)。
よって、"入力された住所のどこまでが郵便番号データに掲載されている住所なのか?"を調べる事も非常に困難です。
よくHPをみてみると数字だけじゃないみたいですね・・・
ツイート | ![]() |