スプレッドシートのweb公開

今回は、スプレッドシートのデータをwebに公開する方法にについてメモしておきましょう。

課題 : (1)蔵書リストをwebに公開すること

     (2)蔵書は、この際、バーコード入力で簡単に登録できるようにすること

     (3)既存の蔵書目録を移管できること

 

さて、蔵書管理ソフトは、いろいろ調べてみました。評判のよいと思われる、Delicious Library 2MediaManなどビジュアルに優れたソフトに惹かれたものの、蔵書目録の移管が思うようにできません。日本語の処理に問題があったり、ISBNがないと移管ができなかったりなど、容易ではありません。既存の蔵書目録には、書名や著者名などはあるものの、ISBNが入っていないのが、やはり根本的な問題で、仮に移管できたとしても、書名等からISBNを引き、そこから、書誌情報を引っ張ってくることをしないと、せっかくの蔵書管理も中身が寂しいわけです。

そこで、この年末年始を使って一念発起! 既存の蔵書データからamazonのwebサービスを使ってISBNや関連書誌情報を集めてくるスクリプトを書くことにしました。(スプレッドシートのweb公開までは、まだまだ先が長いかも)

11月の終わりごろに、イントラネット上でwebアンケートを作る必要があって、はじめてperlなるものに触れていたので、まあ、少しずつやっていけばなんとかなるだろうということで、夜な夜なスクリプトと格闘しておりました。

この環境は、mac osx 10.5.6 , Apache 2.2.9 , php 5.2.6 , perl 5.8.8です。エディターはもっぱらmi 2.1を使います。

いろいろ試行錯誤した結果、以下のスクリプトでamazonから書誌情報を拾ってくることができました。

#!/usr/local/bin/perl

use utf8;
use strict;
use warnings;
#use Jcode;
use Net::Amazon;
use Encode;
#use Data::Dumper;

binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");

#----------------------------------
#初期設定
#----------------------------------
my $infile = './kri_book_query.csv';
my $outfile = './response_data.txt';

#----------------------------------
#入力ファイルオープン
#----------------------------------
	open (IN,"<:utf8","$infile") || print "ログファイルを開けません","\n";
	open (OUT,">$outfile") || print "ログファイルを開けません","\n";
	my $qset = <IN> ; #1レコード目のタイトル行は空読み
	print OUT "1,Title,ProductsName,ISBN","\n"; #1レコード目はヘッダ行の出力
#----------------------------------
#1行ずつread
#シーケンスナンバー、タイトル、出版社、著者の4つのパラメータに分離
#検索処理をcall
#----------------------------------
	while ($qset=<IN>) {
		chop($qset);
		my @Query_keys = split(/,/,$qset);
		&SearchRoutine(@Query_keys);
	}
	close (IN);
	close (OUT);

#----------------------------------
#検索処理 パラメータは「@Query_keys」が「@_」で渡される
# 3つのパラメータをそれぞれutf8にエンコードし
# キーワード「$Key」に半角スペースでつなげてセット
# 検索結果が真であるとき、結果を出力
#----------------------------------

sub SearchRoutine{
	my $seq=$_[0];
	my $KeyTitle=Encode::encode("utf8",$_[1]);
	my $KeyPublisher=Encode::encode("utf8",$_[2]);
	my $KeyAuthor=Encode::encode("utf8",$_[3]);
	my $Key=join(" ",$KeyTitle,$KeyPublisher,$KeyAuthor);

# Set up URL.
	my $ua = Net::Amazon->new (
		token => 'amazonのaccess key ID',
		locale => 'jp',
	);
	my $response = $ua->search (
		keyword => "$Key",
		mode => "books",
	) ;

# Retrieve result.
	if ($response->is_success) {
		for ($response->properties) {
			my $output=join(",","$seq",decode('utf8',$KeyTitle),$_->ProductName,$_->ean,"\n");
			Encode::_utf8_off($output);
			Encode::from_to($output, "utf8", "shift_JIS");
			print OUT $output;
		}
	} else {
			my $output=join(",","$seq",decode('utf8',$KeyTitle),$response->message,"Error","\n");
			Encode::_utf8_off($output);
			Encode::from_to($output, "utf8", "shift_JIS");
			print OUT $output;
	}

}

簡単に内容を説明しておくと、検索キーが含まれる入力ファイルを1件ずつ読み込み、1件ごとにamazonのwebサービスに問い合わせ、検索結果が帰ってくれば、それらを出力し、検索結果が対象外であれば、その旨出力し、最後にcsv形式でファイルに出力します。amazonのawsに問い合わせるには、access key IDの取得が必要ですが、これはすぐに取得できます。

また、最初は、XML::Simpleを使ってクエリーをかけていましたが、文字コードの処理で苦労し、結局は、CPANのNet::Amazonを使いました。CPANのインストールでは、cpan> install モジュール名 と書かれていますが、最初にcpanモードにするときに、sudo cpanとして、スーパーユーザーになっている必要があります。 

この手の作業をやる上で、なかなか面倒なのは「文字コード」です。今回は、入力ファイルは元々Shift-JISでしたが、うまく読み込めなかったので、1回限りの作業ということもあり、miでutf8にエンコードし直して保存したファイルを入力としています。上記のスクリプトファイルは、テキストエンコーディングはutf8、改行はLFです。

実際には、出力されたcsvファイルは、決してきれいなものではなく、元になった検索キーのファイルの書名がexcelのセル内改行があったりしたおかげで、そのままでは読み込めず、これまた、miでcsvに整えております。また、ひとつの検索に対して複数結果が帰ってくる場合には、これも目視により1行のみにするように編集しています。

そうした雑多な作業は発生しましたが、2500件程度の蔵書リストに、ISBNコードや価格、amazonのASINなどを付与することができました。

 

ISBNが取得できれば、使える蔵書管理ソフトの範囲は広がりますが、運用上windows環境で稼働させたいので、最終的には、私本管理v3.6.52でいくことにしました。見た目に派手さはないものの、細かいところまでカスタマイズが可能な、大変優れたソフトです。小規模とはいえ、オフィス内で使うには項目名の変更や、集計単位を自分で作り込めるといった機能はたいへんありがたいものです。

私本管理へのデータ移行は、先ほどの作成したデータをインポートするだけですが、フォーマット(列)が決まっているので、excel等で列の並び替えなどが必要です。ここでは、独自項目、たとえば書籍の要求元やプロジェクトコード、NDCなどをamazonの書誌情報が入ってこない項目にセットしました。

私本管理のデータベースはプレーンなcsvファイル(もちろんShift-JIS形式)ですので、何かと好都合です。ここを起点にweb公開とテプラのシール出力を行う目論みです。

まず、簡単なテプラのほうから、テプラは本の背表紙に貼るシールです。蔵書であることの印であり、本を探すときの手助けになります。テプラの印字ソフトSPC9はexcelファイルやcsvファイルを入力にできますが、これが融通が利かないことにフィイルの修飾子が.datでは読み込めないようになっています。ここまで、冗長性を排した一貫性のある美しいシステムを目指してきましたが、やむなく挫折。datファイルをファイル名だけ変えてcsvファイルにコピーするスクリプトを作りました。

次に、いよいよ本題のcsvファイルをwebに公開する課題です。この課題は、極めて汎用的かつベーシックなニーズであると思われますが、少々調べたところでは、万人向けのお手軽ツールは、今のところないようです。

つまりは、これも何らかのスクリプトをつくって画面を作る必要があるということで、perlやjavascriptのモジュールを漁りつつ、夜な夜なスクリプトと格闘するはめになりました。

いろいろ見てみましたが、いずれは、Ext JS 2.2のGrid filteringを使ってみたいと思います。とはいえ、初心者にはやや敷居が高そうなので、将来の課題にとっておきます。Grid filteringはスプレッドシートの表示と、キー検索に対応した汎用パッケージなので、表の中身に関係なく使える優れものです。ちょうど、excelのオートフィルタに相当するものと思えばよいでしょう。

次の候補は、allan jardineのDataTablesです。これも検索機能のついたスプレッドシートの表示ができます。ただし、これは、元のデータがcsvではなくxmlでないといけません。したがって、csvからxmlに変換するスクリプトと連動して動かしてやればできるんだろう、とは思うものの、javascriptを書いたこともない初心者には時間がかかるだろうと考え、こちらもいずれまたということに。

そうして結局残ったのが、JavaScript++かも日記さんのcsv2table.jsです。

今回の環境では、私本管理のデータベースをイントラサーバーと同じサーバーに置くようにしているので、all windows = Shift-JISの世界です。csv2tableはcsvも直接読めますが、Shift-JISではやはり文字がうまく解釈できなかった気がします(もう、記憶の彼方)。ところが、csv2tableが優れたところは、入力のファイルを指定するところで、phpやperlのモジュールを書くことができるんですね。

というわけで、Shift-JISのcsvを読みながら、webで表示されるフォーマットを意識して、出力項目を編集しながら出力するperlモジュール(これくらいなら何とか書けた)を作り、それをcsv2tableの入力に指定する。

csv2tableでも行の選択はできますが、これをどうやって外部から与えられるかが分からないので、今回は、2500件あまりの書籍名を全件画面に表示し、ブラウザの検索(Ctrl+F)を使ってもらうことにしました。まあ、スマートとは言えませんが、使い勝手はそんなに悪くはありません。

以下に、2つのスクリプトを。

◆csvを読んで編集しながらcsv2tableにデータを渡すスクリプト。windows環境で動作するようになっている。スクリプトのソースはShift-JIS、改行はCR+LF。

#!C:/Perl/bin/perl

use strict;
#use Encode;
use warnings;

print "Content-type: text/html; charset=Shift_JIS\n\n";

	my $infile = "私本管理のデータベースのパス/ファイル名";

	open (IN,"<$infile") || print "ログファイルを開けません","\n";

#	1行目はタイトル行
	my $qset=<IN>;
	print "ISBN,書籍タイトル,著者名,出版社,購入年","\n";

#	2行目以降は書名[1]にリンク[16]を貼る
	while ($qset=<IN>) {
		chop($qset);
		$qset =~ s/\Q"\E//g;
		my @fields = split(/,/,$qset);

		print "$fields[0],";  #ISBN
		if ($fields[16] ne "") {
			print "<a href=$fields[16] target=_blank>$fields[1]</a>,"; #リンクあり
		}
		else {
			print "$fields[1],"; #リンクなし
		}
		print "$fields[5],"; #著者名
		print "$fields[12],"; #出版社
		print "$fields[62]"; #購入年
		print "\n";

	}
	close (IN);   
 

◆画面を表示するhtmlファイル

jqueryは、直接ダウンロードしてもよいし、csv2tableのパッケージに含まれているのでも良い。ただし、バージョンの整合性があるだろうから、csv2tableのサンプルをよく見て組み合わせを選ぶこと。ここでは、jquery1.2.6 , csv2table 2.8を使っている。

<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="content-style-type" content="text/css">

<script src="./js/jquery-1.2.6.min.js"
		type="text/javascript"></script>
<script src="./js/jquery.csv2table-0.02-b-2.8.js"
		type="text/javascript" charset="utf-8"></script>

<script type="text/javascript">
$.extend($.csv2table,{
    loadImg  : './img/icon-loadinfo-w.gif', //Image of now loading...
    sortNImg : './img/icon-n.gif',        //ソート初期画像
    sortDImg : './img/icon-d-orange.gif',        //降順画像
    sortAImg : './img/icon-a-orange.gif'         //昇順画像
  })

</script>

<body>
<Div Align="center">ホームページ タイトル</Div></br>
<Div Align="right"><a href=イントラホームのアドレス>イントラホームに戻る</a></Div>
照会に、しばらく時間がかかります。</br>
★書籍のタイトルや執筆者の検索は、ブラウザの検索機能「Ctrl+F」をご利用ください。</br>
★項目名の横の「▼マーク」で並べ替えができます。</br>

<script>
$(function(){
  $('#view1').csv2table('上記のスクリプトのパス/ファイル名',{
	onload : function(id,op,data,ary){
		$('tr:even','#'+id).css('background','#eee')
		}
  			});
});
</script>

<!-- ここへ表が出力されます -->
<div id="view1"></div>

</body>

結果的に、できたスクリプトは大したボリュームではないですが、ここに到達するためには数多くの試行錯誤がありました。きっと、すぐ忘れてしまうことでしょうが、やっている最中にいちいち書いてもいられず、できあがりだけをここに書いておくことにします。

 

以下に、お世話になったサイトの一覧を記しておきましょう。

◆amazon webサービス(aws)関連

Amazon 書名検索スクリプト

Perl講座 [Smart]

Pumpkin Moonshine: ISBN-13・ASINのどちらのIDからでもAmazon Web Servicesからデータ取得を行う

作って学ぶ、今どきのWebサービス:第5回 Amazon Webサービスを料理してみる (3/3) – ITmedia エンタープライズ

エンタープライズ:AxisによるAmazon Webサービス活用記 (1/4)

Amazon Web Services Developer Community : Migrating from Amazon ECS 3.0

Christopher Boumenot / Net-Amazon – search.cpan.org

Chapter 5. API Reference

RESTでAmazon Web サービスを使い倒すo [Perl講座 -Smart]

Amazon WEBサービス:REST/XSLTを使い倒す1 基礎知識:Goodpic

◆スプレッドシートのweb公開

jQuery 1.2.6 日本語リファレンス

JavaScript++かも日記: 【jQuery】プラグイン CSVファイルをテーブル表示 jquery.csv2table.js

http://jsgt.org/lib/jquery/plugin/csv2table/v002/test.htm

jQuery でCSVをテーブル表示 – [JavaScript]All About

Ext JS 2.2 Samples

ウノウラボ Unoh Labs: Ext.js入門: Grid編

Ext JSによるウェブインターフェースの開発 – page2 – builder by ZDNet Japan

3ステップで表をソート&値を検索できるjavascript「dataTables」|skuare.net

JavascriptでExcelのcsvを読み込む実験 – Web制作(ホームページ制作)のソラソル株式会社(SORASOL)|sorasolな人々

Allan Jardine | DataTables

CSVからXMLへの変換 – Sogolosphere Log

XML::CSV – Perl extension converting CSV files to XML – search.cpan.org

CPAN install エラー対策

KMKM :: jQueryプラグインcsv2tableで変数直接引き渡す方法

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。