たつをの ChangeLog : 2011-03-08

JANコードまわりはまったくといっていいほど無知なので基礎知識だけですが軽く調べてまとめました。随時追記されるかも。一般社団法人流通システム開発センターのページを参考にしました。

§

JAN = Japanese Article Number.
EAN(European Article Number)、UPC(Universal Product Code: アメリカ、カナダ) と互換性のあるコード。
JANコードには標準タイプ(JAN-13, GTIN-13, 13桁)と短縮タイプ(JAN-8, GTIN-8, 8桁)がある。
GTIN-13 には2種類ある。最初の7桁がJAN企業コードのものと最初の9桁がJAN企業コードのもの。

チェックデジット


JANコードのチェックデジットは一番右の桁の数。
例:4902777130835

計算手順:
左から見て偶数位置の数を合計して3倍する。
それと奇数位置の数の合計を足す。
それの1の位の数を10から引くとチェックデジットになる。

JANコード4902777130835
偶数桁 9 2 7 1 0 3
奇数桁4 0 7 7 3 8
→偶数桁:(9+2+7+1+0+3)*2=22*3=66
→奇数桁:4+0+7+7+3+8=29
→66+29=95
→10-5=5(チェックデジット)

企業コード


グローバルコード情報提供サービス「GEPIR(ゲピア)」でコード管理されている企業コードが検索できる。つまりJANコードから企業名が分かる(逆も)。商品詳細は分からない。

検索キー例:4902777130835 (→明治製菓)

JAN-13 の場合、企業コード(メーカーコード)は7桁と9桁がある。JANコードの先頭3桁(国コード+1桁)でどちらか識別できる。456-458 だと9桁。450-455, 490-499 は7桁。JAN-8 の場合は先頭6桁が企業コード。

Perl による判別コード:
my $jan = "XXXXXXXX..."; # JANコード
my $cc; # 企業コード

$cc = $+ if $jan =~ /^((45[6-8]\d{6})\d{4}|(45[0-5]\d{4}|49\d{5})\d{6}|(\d{6})\d\d)$/;
# MEMO: $+ は最後にマッチした文字列を返す

書籍JANコード


二段になっている。

書籍JANコード(説明用サンプル)

一段目:
最初の3桁がISBNを表すプレフィックス、978。
残りの9桁が国記号と出版者記号と署名記号。最後がチェックデジット。
二段目:
最初の3桁が書籍JANの2段目であることを表すプレフィックス192。
次の4桁が図書分類。次の5桁が税抜本体価格。最後がチェックデジット。

出版者記号(出版社記号ではない)については、日本図書コード管理センター出版者検索]で調べることができる。

検索キー例:「講談社」「339」

JANシンボル


JANシンボル(国際的にはEANシンボルと呼ばれる)とは要するにバーコードのこと。

関連記事


追記

  • 追記110310: 書籍JANコードのメモを一部修正。ご指摘感謝。
  • 追記110311: 企業コードについて追記。
  • 追記110314: 企業コードを判別するPerlスクリプトを追記。
  • 追記231110: リンク先 URL を最新のものに変更。

何かのタスクの出力結果として巨大なテキストファイルが得られたとします。これが手元の UNIX 環境に置いてあるだけなら less コマンドや head, tail コマンドでさらっと中身を覗けます。
しかし、他の何人かで共有して中身を軽く確認してもらいたいという場面があります。IT系でない人に見てもらいときなどはいろいろと大変です:
(1) データの置いてあるサーバにログインしてもらう→「アカウントない」「コマンドわからない」
(2) イントラのファイル共有→「ファイルが大きすぎて開けない」
(3) イントラWebサイトにアップロードしてブラウザで見てもらう→「IEが固まる」「PCが激重」

こういうときには100行くらいのページごとに表示するCGIが役に立ちます。昔からよく使っている「その場しのぎ」CGIを載せておきます。

■コード(textviewer.cgi):
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI;
use HTML::Template;

my $filename = "(TEXTFILENAME)";
my $n = 100;

my $q = new CGI;
my $from = $q->param('f') || 1;
my $next_line = $from + $n;
my $pre_line = ($from - $n > 1) ? $from - $n : 1;

open(my $fh, "<", $filename) or die;
my $str = "";
while (<$fh>) {
  next if $. < $from;
  last if $. >= $from + $n;
  $str .= $_;
}
close($fh);

my $template = join("", <DATA>);
my $t = HTML::Template->new(scalarref => \$template,
			    global_vars => 1,
			    die_on_bad_params => 0);
$t->param(from => $from);
$t->param(str => $str);
$t->param(next_line => $next_line);
$t->param(pre_line => $pre_line);

print $q->header(-charset => 'UTF-8'), $t->output();

__DATA__
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Large Text File Viewer</title>
</head>
<body>
<a href="?f=<TMPL_VAR name=pre_line>">&lt;&lt;</a>
<a href="?f=<TMPL_VAR name=next_line>">&gt;&gt;</a>
<hr>
<pre><TMPL_VAR name=str></pre>
<hr>
<a href="?f=<TMPL_VAR name=pre_line>">&lt;&lt;</a>
<a href="?f=<TMPL_VAR name=next_line>">&gt;&gt;</a>
</body>
</html>

設置例:
http://chalow.net/misc/textviewer.cgi
(対象データは cl.itemlist。ブログ内検索用のテキストファイルで2MB, 12000行。EUC-JP なのでコードもちょっと変更してます。)
この記事に言及しているこのブログ内の記事

たつをの ChangeLog
Powered by chalow