そしてそして、Ruby 奮闘記が開幕する

今回は、1000 件ほどの蔵書データベース入力(移植)だ。
手作業で 1件 30秒の流れ作業ができたとしても、8時間以上かかる計算になる。
不可能な作業量ではなさそうなところがまた迷いを誘うのだが……もし同じ時間や労力が必要になるとすれば、単純作業の繰り返しより、Ruby の勉強ができたほうが得るものは圧倒的に大きい
やるべきことは、決まった。

まず Amazon のサイトから「持っています」リストを引っ張り込むのは自動処理を諦めて手作業にする。無謀な挑戦は絶対しない、欲張らない、やれることをきっちり確実にこなす、このディレクションが超重要
Amazon のリスト表示は、1ページに 15件ずつしか表示されないので、60ページ以上の手作業による保存が必要になる。まあ許容範囲だろう。
その HTML ファイルを読み込んで ASIN 部分を検索し抽出するプログラムを考える。
実際には、書きながら、考えながら、調べながら、トライ&エラーを繰り返しながら一つずつクリアしていった。

データ(ファイル)の読み込みはマニュアル通りに書けば楽勝なので、次に ASIN の検索を考える。
手作業で保存した「持っています」 1.htm 内には URI が沢山あって、そこから ASIN を検索していくわけだが、そこで正規表現がほんの少しだけでも分かるのは好都合だった。迷うことなくそこに到達しトライする。
試行錯誤の結果、~/dp/◯◯◯◯◯◯◯◯◯◯(←必要なのはこの10桁)の部分を切り取って、そこから余計な /dp/ を除去するという処理にした。というか、一発で切り取れる方法が思いつかなかった……。一発で処理できればいいのかもしれないが、そのために延々とハマり続けて時間を無駄にするより、二発で簡単そうならそれで妥協するのも必要だ。宇宙へ飛ばすロケットだって二段~三段式が当たり前のように……。

これを出力すれば OK かと思いきや、「持っています」 1.htm 内にある、1品目あたり画像と文字の二つにリンク(URI)があるので、それが重複してしまうのと、1行区切りの入出力で空行(nil)ができてしまう問題があった。メディアマーカー側のインポート機能は、1行 1項目というルールだったので、それに合わせた出力結果にしたかった。(重複していてもメディアマーカー側が弾いてくれるけど)

正規表現の処理だけではまず無理なので、配列に入れるという基本中の基本を試す。
配列に入力する段階で、空(nil)をスルーしながら、という形で上手くいって、重複の除去は最終出力の「puts 配列」で「uniq」を付けることで上手くいった。
このへんはマニュアル類を見ながらやれば猿でもできる系なのが嬉しい。
C言語なんかでやろうとすると多分大変なことになるんだろうなぁ、なんて漠然とアホ面で天上界を見上げた。

そして、なにげに一番苦労したのが、複数ファイルの読み込みで、60ファイル以上あるものを手作業で保存したんだから、読み込みも手作業に(毎回スクリプト内(もしくはファイル名の方)をちょっと書き換える)しようかな……と妥協しかけたが、ここまで来ると少し欲が出てしまうし、やれそうな気がしてくるもので……。
まず最初に思いついたのは、ファイル名を 1.htm 2.htm…… と連番で保存しておいたので、スクリプトの方でも連番でループ処理していくようにと、最も簡単な方法を考えていたが……欲張った。
指定ディレクトリ内にあるファイルパスを拾ってきて、それを順次処理させることにした。(逆にこれのほうが問題が起こる可能性は広がると思うのだが……まあ自分専用だからいいんだけど)
これが大苦戦し……、つまりは find 一発目の処理で、空(nil)が与えられると open できずにそこで終了しているようなのだ(たぶん)。というか、それに気づくまでが素人には大変なのだが……。
なんとなく原因がわかれば対処はそんなに難しくないので、とはいえ、そもそも10行スクリプト程度だし、なにか難しい処理をさせているわけでもないし、1行追加する程度で事は片付く。

どんなにちっぽけな作品でも、こうして作り終えた後の余韻は格別なものだ。
プログラムを走らせると、ダァーっと ASIN が滝のように流れる。
それを Ctrl + C で拾う。(ファイル出力なんてもんは書いていない)
そしてメディアマーカーの一括登録枠に Ctrl + V で流しこむ。
「一括登録」をポチる。
無事 934件登録完了!!
購入金額 1,508,282円の表示に、ほっほぅ、と感心する。

でもなんで俺は Ruby を弄ろうとするのだろう。
やっぱり「国産」って響きが好きなんだろうな……。




タイトル :
名前 : URL :
お手数ですが下記入力項目に「トリプリ」と入力してからの投稿をお願いします。