1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

低レベルPerlスクリプトのススメ ~ 「readtsv」の紹介

Last updated at Posted at 2023-12-12

はじめに

昨年に比べて、今年のPerl Advent Calendarへの投稿は少し低調のようです。まだ多くの空白日が残っていますね。

確かに昨今perlはあまり流行とは言えません。かつてのCGIの需要はjavascriptやRubyに持っていかれ、AIだの機械学習だのの脚光はもっぱらPythonが浴びています。もう時代の最先端をperlを走る時は来ないのかもしれません。

しかし私は今でもperlについて世に問うことには大いに意義があると考えています。私が考えるに、perlは低レベルスクリプトこそが命です。

ここでいう「低レベル」は、「最先端ではなく、地味で、時代遅れなように見え、しかしあればあっただけ何らかの意義が感じられるような」レベルとうけとっていただきたい。どちらかというとかつて月刊アスキーで連載されていた『低レベルソフトウェア研究所』にて提唱されていた概念に近い(同じとは言いません)ものです。この観点に限れば、perlは今も他の多くの言語を押しのけて上位に君臨しているのではないでしょうか。

というわけで、私から自作の「低レベルソフトウェア」を紹介させてください。GitHubに公開しているPerlスクリプト「readtsv」です。

readtsv: TSVファイルを簡単に扱うスクリプト

「readtsv」は、TSVファイル閲覧・簡易整形ツールです。

なぜ誕生したのか?

今から14年前、私は業務で大量のTSVファイルを作成しあるいは共有していかなければならない状況でした。

TSVはシンプルで使い勝手の良いフォーマットです。しかし、自作ツールが(あるいは同僚の誰かが)吐き出してきたファイルが約束にちゃんと従っているのかとか、自分が欲しいデータがいったい第何カラム目に入っているのかとか、確認に手間取ることがあります。lessとか使うわけですが、なにしろタブは目に見えないからわかりにくい。一行が何百文字もあると目視と言っても簡単に死ねます。

そこでとりあえず、TSVファイルのタブコードを"|"に置き換えて出力するという単純なワンライナーを書きました。しかし、目視確認の必要はその後も頻繁に生じたため、これをスクリプトファイルとして保存し、簡単に呼び出せるようにしました。これがreadtsvの起源です。

その後、複行レコード化やHTMLテーブル化などをやりたい機会があり、そのたびに機能を追加していきました。

最初にワンライナーを書いたところから3回職場を変わり、その倍の回数のマシン乗り換えを経験しましたが、このスクリプトは全ての環境に持っていくことになりました。今も職場・自宅の両マシンで頻繁に使っています。それにしても、ほんの軽い思い付きでかいたスクリプトを14年間も使い続けることになるとは思ってもみませんでした。

使用方法

もっとも基本的な使い方はTSVファイルの中身を見ることです。
まずタブ文字を可視化。それでも見にくい場合は、フィールドごとに行を変えて出力し(複行レコード化)、内容を楽に目視確認できます。

tab_space.PNG
「スペースじゃなくタブで区切れつってんだよ。全く素人は困るぜ!」

  • 基本コマンド: readtsv input.tsv
    • このコマンドは、指定されたTSVファイル(ここではinput.tsv)を読み込み、タブ文字を"|"に置き換えて出力します。

オプションによる機能拡張

  • -k a,b: 指定列のみを抜き出して出力
  • -m: 複行レコードとして出力
  • --html: HTMLテーブルとして出力
  • -ifs ',': 入力時のフィールド区切り文字を指定
  • -n: フィールド数、行番号、ファイル名を付加して出力
  • -s ',': 出力時のフィールド区切り文字を指定

使用例

$ cat test1.tsv
かな	性別	ID
あいうえお	男	0120-1234-1111	
かきくけこ	男	0120-1234-2222	
さしすせそ	女	0120-1234-3333

$ readtsv test1.tsv
かな|性別|ID
あいうえお|男|0120-1234-1111
かきくけこ|男|0120-1234-2222
さしすせそ|女|0120-1234-3333

$ readtsv -m test1.tsv
1-0: かな
1-1: 性別
1-2: ID
2-0: あいうえお
2-1: 男
2-2: 0120-1234-1111
3-0: かきくけこ
3-1: 男
3-2: 0120-1234-2222
4-0: さしすせそ
4-1: 女
4-2: 0120-1234-3333

$ readtsv -k 0,2 test1.tsv
かな|ID
あいうえお|0120-1234-1111
かきくけこ|0120-1234-2222
さしすせそ|0120-1234-3333

$ readtsv -s '/' test1.tsv
かな/性別/ID
あいうえお/男/0120-1234-1111
かきくけこ/男/0120-1234-2222
さしすせそ/女/0120-1234-3333

$ readtsv -k 0,2 --html test1.tsv
<html><body><table border="1">
<tr><td>かな</td><td>ID</td></tr>
<tr><td>あいうえお</td><td>0120-1234-1111</td></tr>
<tr><td>かきくけこ</td><td>0120-1234-2222</td></tr>
<tr><td>さしすせそ</td><td>0120-1234-3333</td></tr>
</table>
</body></html>

インストール方法

このスクリプトを適当なディレクトリに置き、Perl5がインストールされている環境で使用してください。

むすび

perlの縁の下の力持ち的なニーズは今も存在していますし、今後もそれが絶えることはないと思います。perlをディスリ最先端の需要にばかり目を向けている意識高い系のITエンジニアのことは放っておいて、私たちはPerlを使って実り豊かなITライフを送りましょう。

そのためには、このような「低レベルスクリプト」を共有することも、非常に有効だと思います。皆さんも、手元にある同じようなスクリプトをぜひ紹介してください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?