カスタマバーコード


久美子  2007-12-08 21:24:46  No: 28869

QRBarImageを使用して、宛名ラベルーにカスタマーバーコードの印刷をしたいのですが、漢字かな混じりの住所データからカスタマーバーコードのための文字列を取出す関数がどこかにありませんでしょうか。


KHE00221  2007-12-08 23:18:13  No: 28870

関数ではないけど

バーコードに必要な文字情報抜き出し法

http://www.post.japanpost.jp/zipcode/zipmanual/p17.html


DEKO  2007-12-08 23:43:15  No: 28871

描画関連は...

Seizoさんのコンポーネントや
http://www.vector.co.jp/soft/win95/writing/se196641.html
私のユニット
http://homepage1.nifty.com/ht_deko/junkbox.html#BARCODE
を使ってTQRImageに自前で描画する必要があると思います。

# カスタマーバーコードは"日本の"日本郵便(旧郵政省)
# 独自のバーコードですからねぇ...。


久美子  2007-12-09 00:00:02  No: 28872

郵便事業(株)のホームページにロジックが載っているのは知っていたんですが、どなたかこれをDelphiのプログラムで作成していらっしゃいませんでしょうか。


DEKO  2007-12-09 01:02:28  No: 28873

・番地が漢数字で書かれている場合がある。
・住所に数字が含まれる場合がある。

このため、自動で抜き出すのは不可能とは言いませんが、現実的ではありません。

・住所と番地が分離されている。
・番地は必ず(半角)数字で記述されている。

のであれば、普通に数字を抜き出すだけでいいのですが、
実際にはそううまくはいきません。

# 郵便番号だけのカスタマーバーコードでも受理される事があるようです。
# 一度、問い合わせてみてはいかがでしょうか?


久美子  2007-12-09 05:32:30  No: 28874

DEKOさんありがとうございます。「現実的ではありません」との忠告ですが、あきらめ切れません。


ということは  2007-12-09 06:28:58  No: 28875

>あきらめ切れません
久美子さん自身は完璧なものが出来そうな見通しがあるのですか?


KHE00221  URL  2007-12-09 08:10:53  No: 28876

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.


KHE00221  2007-12-09 08:13:36  No: 28877

TFieldData はきにしないで・・・・


DEKO  2007-12-09 08:26:28  No: 28878

三重県四日市市楠町北五味塚六の七 八幡ビル九号棟一〇二 三宮様方
(住所は架空のものです)

...なんて住所があったりしますからね(^^;A
# 京都とかは普通に大変だと思いますが。


DEKO  2007-12-09 08:32:36  No: 28879

...それと、
"登記上の住所と郵便番号の住所が一致しない事がある"ので、
郵便番号の住所を利用できない事があります。

# 大分県の方には心当たりがあるかもしれませんね。


KHE00221  2007-12-09 10:16:23  No: 28880

とえあえず
数字だけ抜き出すのは

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

も当然はいってしまいます

ここの判断は・・・相当めんどくさそうですが(できるのか?)


DEKO  2007-12-09 10:52:16  No: 28881

流石はKHE00221さん。要点が解ってらっしゃる。

"(以下に掲載がない場合)"な住所に数字が含まれる可能性もありますから、完全自動化は相当面倒です。

> "登記上の住所と郵便番号の住所が一致しない事がある"ので、
これは、郵便番号データに"住所が存在しない事がある"というものです。
この地域の方に郵便番号を聞いて郵便番号データを検索すると違う住所が出てきます(住所<->郵便番号双方向ともに変換できない)。

よって、"入力された住所のどこまでが郵便番号データに掲載されている住所なのか?"を調べる事も非常に困難です。


KHE00221  2007-12-09 21:44:27  No: 28882

よくHPをみてみると数字だけじゃないみたいですね・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加