sed manual

SED マニュアル:雑誌記事索引篇


[戻る]



          INDEX



■ スクリプト言語 SED を使った、雑誌記事索引データのCSVファイル化


「雑誌記事索引(MAGAZINPLUS)」のWebページから検索結果をダウンロードしても、(ノイズが多いため)、そのままでは、定型的なCSV形式ファイルにはならない。
スクリプト言語の「 SED 」を使えば、わりあい簡単に、ダウンロードしたデータを、項目(=フィールド)数を揃えたCSV形式ファイル化して、表計算ソフトやDBソフトに読み込むことが可能になる。
以下、その方法を略記する。

● 雑誌記事索引データ


まず、ダウンロードした生データ(仮に「zk.txt」とファイル名を付ける)は、1レコードが、次のようなものである。

□  
 #0001〜#0200 〈230 件中〉 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]   
 
1  標□題 すばる文学カフェ ひと ジェラルド・ヴィゼナー 
著者名 巽孝之 
誌名等 すばる [ISSN:03876381] (集英社) 27(1) 2005.1 p180〜183 
備□考 NDL請求記号Z13-2155 【日外整理No.ZV497696】 
 

これは、不要な空白行(全角スペースと半角スペースが混じった行も含む)が多く混在しており、そのままでは、とてもデータベースや表計算ソフトで読み込めない(判りやすくするため、全角のスペースを「」記号で表している)。
また、前後にデータにはならない文字列が入っている(これは、前後にしかないから、簡単に除去できるが)。
さらに、各レコードに、DB化する時には、不要となるだろう連番の書誌番号まで入っている。

もっとも、以前(CD−ROM版の雑誌記事索引DB)は、もっと面倒で、次のようなデータであった。
(なお、元データは、カタカナが半角であったが、インターネット上に半角カナ文字を流すのは御法度なので、全角に換えてある)

001 009187760007
011 0385-6623
200 橋からサンフランシスコが見える--ウィリアム・ギブスン「ヴァ-チャル・ライト」またはポスト情報都市の文学(情報化社会のゆくえ<特集>)
210 巽孝之
230 p33〜40
250 地域開発
280 356 [1994.5]
500 ハシカラサンフランシスコガミエルウイリアムギブスンヴア-チヤル;ウイリアムギブスンヴア-チヤルライトマタハポストジヨウホウトシノブンガク
510 橋;サンフランシスコ;ウィリアム;ギブスン;ヴァ-チャル;ライト;ポスト;情報;都市;文学;情報化;社会
686 K62
905 Z3−445

ここで、001 は資料番号、200 は論題、210 は著者名、230 は頁、250 は雑誌名、280 は雑誌の巻号・刊年、500 は論題から切り出したキーワードのカタカナ読み、510 はキーワード、905 が雑誌記事索引での整理番号である。他の行頭番号は不要なレコードとなる。

当時は、だから、これだけの9項目を抽出すればよいので、他のノイズとしての項目を削除して、該当項目だけを抽出するため、次のような「 SED スクリプト」 を書いていた。


s/^001//p
s/^200//p
s/^210//p
s/^230//p
s/^250//p
s/^280//p
s/^500//p
s/^510//p
s/^905//p

幸い、今では、「MAGAZINPLUS」で検索した雑誌記事索引データは、「標□題」「著者名」「誌名等」「備□考」の4項目しかないので、もっと簡単なスクリプトで済む。

以下のようなものである。

s/^標□題//p
s/^著者名//p
s/^誌名等//p
s/^備□考//p

ただし、その前に、いくつか「前処理」が必要となる。

まず、WZエディタで、変換機能を使って(「編集」→「変換」)、「行末の空白を除去」しておく。これで、半角全角スペースが全て削除される。
さらに、不要な空白行があるので、これもエディタの置換機能を使って、検索文字列を「^\n」として、置換文字列をブランクにして除去する。
正規表現で、「^」は、行頭を意味し、「\n」は改行マークを意味するので、「^\n」だと、空白行を表す正規表現となる。

さらに、各レコードごとに付番された半角数字の番号も、不要である(後で、SED の処理の際、邪魔になる)。
これは、よく見ると、番号の後に、半角スペースが1個、空いている。だから、正規表現で、検索文字列を「^[0-9]+ 」にして(「+」記号の後に、半角スペース1個を入れている)、置換文字列をブランクにする。
^」は行頭、「[0-9]」は任意の半角数字、「+」はその繰り返しを意味するから、これで1桁から3桁までの番号は全部、除去され、さらにその後の半角スペースまで検索文字列にしているので、結果的に、連番の数値文字列は削除され、「標□題」が行頭にくる。

ここまでエディタ内で前処理をして、それから、先ほどのSED スクリプトを使って、不要な「標□題」「著者名」「誌名等」「備□考」を削除するのである。

このページのトップに戻る

● SED


「SED 」は、フリーウェアのスクリプト言語で、エディタなどで書いたスクリプトを使って、定型の文書ファイルを比較的、容易に整形することが出来る。

もともとUNIXの処理系だったのだが、MS−DOSに移植され、現在では、Mac版やWindows版もある。
次の2つが、Vector サイトから落とせるし、わりあい簡単に操作できる。前者は実行ファイルで、後者は「DLL」ファイルである。

sed


sed


原理としては、実行ファイルの「 sed.exe 」は、パスの通ったフォルダに格納しておく。
「パスの通った」というのは判りにくい表現だが、MS−DOS時代は、Cドライブ直下にある、「autoexec.bat 」内に「PATH = c:\uty 」というように記述すれば、HDDのどこからでも、そのフォルダ内の実行ファイルを呼び出すことが出来る仕組みであった。
WindowsXPでも、(中味がゼロの)「autoexec.bat 」はあるのだが、この方法はWindowsユーザには面倒であろう。とりあえず、実行ファイルの「sed.exe」や「sed.dll」ファイルを、「c:\Windows」か「c:\Windows\System32」フォルダにコピーしておけば、OKのようである。

作業用のサブフォルダを作っておいた方がよい。これを「C:\UTY 」とする。この中だけで作業を行うのであれば、先の措置は不要で、SED 関係の実行ファイルもスクリプトも、全部、ここに格納しておき、(少し、不便だが)ここだけで作業を完結すれば、パスの問題はなくなる。

Macには、「SedMac 」なる、完全にGUI環境で操作可能な移植ツールがあるそうだが、残念ながら、Windowsには、そんなものはない。
いわゆる「DOS窓」、すなわち、Windows98SE では「プログラム」→「MS-DOS プロンプト」、WindowsXPでは、「すべてのプログラム」→「アクセサリ」内の「コマンドプロンプト」を起動し、その(黒い)DOS画面から操作するしかない。

そこで、SED のスクリプトを書いて、拡張子「 .sed 」を付けて、ここでは「zk.sed」として保存し、コマンドラインから――、

a:\>sed -n -f c:\uty\zk.sed file1 > file2


というように入力すれば、file1 の中の、スクリプトで指定した文字列だけが、置換されて、file2 に出力される。
file1 が「zk.txt」なので、file2 は任意に、「zk02.txt」とでもしておく。

この場合、オプションの、「-n 」とは、標準出力を抑制する引数であり、このオプションにより、置換が行なわれた行だけが出力され、不一致となる他の行は出力されない(結果的に、grep のような機能も果たすわけである)。

ここで、スクリプト中の「 s 」コマンドは、正規表現を指示し――、

s/(正規表現を使った検索)文字列1/(置換)文字列2/p


として、正規表現にマッチした文字列1を、文字列2に置換して、出力する。
文字列2をブランクにすれば、その文字列は削除されて、出力される。ここで、項目名を意味する「標□題」等の文字列はデータとしては不要なので、削除する。
最後の、「p 」は、データを明示的に出力するための「フラグ」である。
また、文字列の前に付された、「^ 」(キャレット)記号は、特に「冒頭にある文字列」を指定する正規表現である。この記号により、データ中に、例えば、ページ数としての、「210 p.」などの文字列があったとしても、それは無視される。
コマンドの、「-f 」は、その次のパラメータ(=ファイル)を、SED のスクリプトとして指示するためのオプションである。
「-n 」オプションは、デフォルトの標準出力を抑止し、「p」フラグと組み合わせることで、「GREP 」と同じ指定になる。
現在の「MAGAZINPLUS」では、不要レコードがないため、必要はないが、かつての「雑誌記事索引」のデータには、不要項目があったために、不一致のレコードをこれによってフィルタリングし、除去していたわけである。

このページのトップに戻る

● Windowsでのバッチ処理


こうした作業が、1回きりならば、これだけでもいい。
だが、定期的・定型的に、何度も同じ仕事として、くり返してやらなければならない時は、「バッチ処理」をした方が早い。
バッチ処理は、「バッチファイル」を作成して、次回からは、それを起動することで、ルーティン作業を行うのである。

Windowsユーザにとって、バッチファイルは難しそうに思えるが、大したことはない(バッチファイル自体は、内容が単なるテキストファイルなので、エディタで書ける)。何より、処理が単純化されるので、定型的な作業に向いているし、作業自体は、コマンドプロンプトからではなく、アイコン化したショートカットをWクリックするだけなので、楽である。

手順としては、まず、HDDの任意のフォルダ(ここでは、C:\UTY )に、SED のスクリプトを格納し、次のバッチ・ファイル(「zk.bat」)を書く。

c:\uty\sed.exe -n -f c:\uty\zk.sed %1 > c:\uty\temp001.txt


この「zk.bat」のショートカットキーを作成し(エクスプローラで、このバッチ・ファイルを右クリックして、メニューから「ショートカットの作成」を選択すれば出来る)、それをWindows98SE ならば、「C:\WINDOWS\SENDTO 」のフォルダにコピーする。XPでは、少し異なり、「C:\Documents and Settings\XXX\SendTo」フォルダとなる(「XXX」の部分は、Administrator 権限でログインしたオーナー名が入る)。

この「SendTo」フォルダは、エクスプローラや卓駆★で、任意のファイルを右クリックした際に出る、コンテキストメニュー内の「送る」のプログラムが格納されている。換言すれば、ここにショートカットを作成することで、「送る」項目に追加がきくのである。
判りやすくするために、「zk.batのショートカット」の名前をリネームする。ファイルをクリックし、ファンクションキーF2を押下すれば、名前が不確定になるので、そこで例えば「雑誌記事索引DB処理」とリネームしておく。
以上で事前処理は完了。

雑誌記事索引CD−ROM版のWebページからFDにダウンロードした検索結果のファイル、ここでは、「zk02.txt」 と名付けているが、このファイルを、エクスプローラ上で、右クリックする。そしてメニューの「送る」をクリックして、「雑誌記事索引DB処理」を選択する。
そうすれば、SED によって、「zk02.txt」が整形され、FD内に、次のような、「C:\UTY\TEMP001.TXT 」が出来る。

すばる文学カフェ ひと ジェラルド・ヴィゼナー
巽孝之
すばる [ISSN:03876381] (集英社) 27(1) 2005.1 p180〜183 
NDL請求記号Z13-2155 【日外整理No.ZV497696】
選考座談会 小説の読まれ方(第十一回三田文学新人賞・決定――最終候補全作品と選考座談会)
荻野アンナ;室井光広;巽孝之(他)
三田文学 〔第3期〕 (三田文学会 三田文学会 岩波ブックセンタ-) 83(77) 2004.春季 p128〜141
NDL請求記号Z13-26 【日外整理No.ZV161207】

これだと、4行を1単位とする1レコードの集合なので、比較的容易にCSV形式のファイルにすることができる。

このページのトップに戻る

● データのCSV化


データは、テキストファイルの形で残しても、(検索対象にはなるし)、それなりに役に立つが、やはり、大量のデータの場合、データベースソフトや表計算ソフトに読み込んで使った方が便利である。

そのためには、元データがテキストファイルの場合、CSVファイル化するのが一番、手っ取り早い。
CSV(Comma Separated Value)フォーマットは、1レコード内の項目(フィールド)を、文字通り「カンマ」で区切る形式のデータである。
単にフィールドをカンマで区切るだけのこともあるが、フィールド内の文字列に「カンマ」が入っていると、読み込みエラーとなるので、フィールドを「""(ダブルコーテーション)」記号で囲み、見た目は「","」のように区切ることが多い。

この形式だと、ほとんどのデータベースソフトや表計算ソフトで読み込み可能である。Excelで読み込んでから、ソートしたり、データ管理したり、といったことが自在に出来る上に、元はテキストファイルだから、エディタで修正も追加も可能、という使い勝手のよいフォーマットである。

ついでに付言すると、Excelからエキスポートして、CSVファイルを作るには、「名前を付けて保存」の際、「CSV (カンマ区切り)形式(*.csv)」を選ばず、「テキスト(タブ区切り)(*.txt)」を選択した方がいい。
前者だと、ダブルコーテーションがフィールドに対し、不規則に付けられてしまうことがあり、なにか処理を加えて、再度、インポートする時に、都合が悪くなることがる。

タグ区切りのファイルだと、区切り記号がタブ(制御コード)なので、エディタの正規表現を使った一括置換で、タブは「\t」だから、これを検索文字列にして、置換文字列を「","」にし、置換する。さらに、行頭と行末にダブルコーテーションを付与すれば、CSVファイル化できる。少し、回り道だが、こちらの方が確実である。

このページのトップに戻る

● 一太郎のリンク形式保存


さて、「一太郎」には、「リンク形式」という保存スタイルがある。

一太郎に、この「TEMP001.TXT 」を読み込み、「ファイル→保存」を選び、ファイル名を、とりあえず、「zk001.txt」として、保存形式を、「リンク形式1」にし、「リンク1項目数」を「4」に変更して、保存する。
これによって、次のようなCSVファイルが出来る。

"すばる文学カフェ ひと ジェラルド・ヴィゼナー","著者名 巽孝之
","すばる [ISSN:03876381] (集英社) 27(1) 2005.1 p180〜183 
九州大学蔵書検索へ
","NDL請求記号Z13-2155 【日外整理No.ZV497696】"
"選考座談会 小説の読まれ方(第十一回三田文学新人賞・決定――
最終候補全作品と選考座談会)","著者名 荻野アンナ;室井光広;巽孝之(他)
","三田文学 〔第3期〕 (三田文学会 三田文学会 岩波ブックセンタ-)
 83(77) 2004.春季 p128〜141
","NDL請求記号Z13-26 【日外整理No.ZV161207】"

表示の都合上、適当な箇所で改行しているが、各々、行頭から「【日外整理No.ZVxxxxxx】"」までが、1レコードとなる。
これを、表計算ソフトなり、DBソフトなりに読み込ませれば、即座に、個人的なデータベースが簡単にできる。
エディタの正規表現を使った置換機能をくり返せば(そして、それをキーマクロで保存すれば)、たった4行の定型的なレコードは、わりあい簡単にCSVファイル化できるかも知れない。だが、一太郎に、せっかく、このような機能があるのだから、利用する方が得だろう。わざわざ正規表現など使わなくても、自動的にワープロソフトがやってくれるのであれば、そちらを使う方が早い。

このように、ツールというものは、効率よく使えばいいのであって、なんでもかんでも正規表現で片付けようとか、SED などのスクリプト言語で、本来、表計算ソフトでやれば手っ取り早い仕事をしたりすることはない。
時々、これらのスクリプト言語の(UNIXやMS−DOS時代からの)達人が、そのような方法を採っているのを見かけるが、ろくに表計算ソフトがなかった(あるいは高価で、手に入りにくかった)MS−DOS時代の昔なら、いざ知らず、たいていの事務室や研究室で、あるいは個人でもExcelが比較的、安価に買える今、そんなことをやるのはバカげていると思われる。
むろん、例えば、SED を使った方がExcelより簡単で迅速に出来る作業の場合は、そちらを使えばいいのだが、ケースバイケースで、そのつど、一番、効率のよい作業方法を選ぶことも、仕事を早く片付けるには、大切な事柄の1つである。


注※
「TEMP001.TXT 」は、毎回、同じ名前のファイルとして出力されるので、もし連続して複数のダウンロード・ファイルを変換作業するのであれば、そのつどファイル名をリネームする必要がある(さもないと、すべてTEMP001.TXT の名前で上書きされて、最後の処理しか残らないことになる)。


このページのトップに戻る





Last Updated: 2005.2.4
初出:九州大学教育学部等図書掛 部内マニュアル (1998.9.24)