青竹雑記帖(6代目)

テキスト処理をメインとしたIT解説をします。

文字だけで扱うコンピュータの世界(12):テキストデータの料理道具

仕切り直し

はい、論文は未だ終わっていません。ゴミです。ただ、ゴミを散らかしてゴミ屋敷にするくらいなら、せめてゴミ袋にまとめて不法投棄すべきなので、その敗戦処理を進めています。同じものにばかり向かい合っていると頭が凝り固まるので、そろそろ再開します。なんと前回の第11回からもう23日経っています。毎日書いたらとっくに34回目になっていたことでしょう。この連載は全255回なので。

blog.aotake91.net

おさらい:テキストデータの形を揃える重要性!

前回、CSVファイル(カンマ区切りファイル)というテキストデータの形式を紹介しました。種々の情報をカンマ記号によって区切って並べて表現するという、簡易的なデータベースのひとつともいえる形式です。このように整えると、今から話すデータ処理がとてもやりやすくなります。

……ところで、実は私、CSVファイルがあまり好きではありません。区切り記号がカンマであるというのは、実はかなり厄介です。とりわけ、カンマが文の区切りとして現れる分、日本語圏よりも英語圏の方が大変かもしれません。どのくらい厄介かを一例として示しますと、

  • 数字を3ケタごとに区切って表示したものをそのまま保存できない。
  • 文章の区切りとして現れるカンマを、データ区切りのカンマと分ける必要がある。
  • 上記の問題を解決するため、データを1つずつ "(ダブルクォート)で囲む方法があるが、データ中にダブルクォートが出てくると、それをデータ囲みのダブルクォートと分ける必要が出てくる。

……やる気なくしました? 奇遇ですね、私もです。CSVファイルは単純な分さまざまな記述法が乱立し、2005年10月にようやくそれらをまとめる形のメモとして、RFC4180 (Common Format and MIME Type for Comma-Separated Values (CSV) Files) が出されました。ただ、これは他の多くのRFCと異なり、標準を定める文書ではありません。単に、CSVファイルがどのようなものであるかを示した情報提供文書の位置付けです。

https://www.ietf.org/rfc/rfc4180.txt

でも、こういう一定の区切り記号でデータを記述すること自体は好きです。私が持つIT的十徳ナイフ・シェルスクリプトAWKの組み合わせで刻みやすいので。区切り記号がカンマ以外、できればデータ中に出て来ないものでありさえすれば良いのです。こうした場合の区切り文字として、よく使われるのが「タブ文字」(ASCII 0x09)です。タブ文字は通常、データ中に使われることはありません。それでいて、キーボードからは「Tab」キーを打つだけで入るので大変入力しやすい文字です。……あー、でもスマートフォンタブレット端末からは入力しづらいと思われます。端末のソフトウェアキーボードにタブ入力のボタンが無いので。

みなさんがタブ区切りを目にする機会のひとつは、ウェブブラウザ(Google Chrome系でもFirefoxでも)で表形式のものをコピーしたときでしょうか。このとき、セルの区切りがタブ文字に変換されてクリップボードに入ります。そのまま貼り付けると、タブ区切りのデータが完成です。せっかくなので、だいぶ前に語ったテキストエディタをどれかひとつ開いて、データを貼りつけて保存してみてください。

料理道具の紹介

ここからは、テキストデータの料理道具を紹介していきます。基本的にはプログラミング言語の紹介になります。正直ありきたりな言語しか取り上げません。あまりエッジの効いた言語を紹介しても応用がまだ難しいと思われますし、なにより私自身が書けません。Haskellまじでこわい。

1. Pythonプログラミング言語

……あまり好きではありませんが、おそらくいろいろなことができて、応用も効いて、あなたのイットライフ(ITライフ)を豊かにするものですから、それを紹介しないのは信義則にもとります。ですから一番手に出します。

www.python.jp

いろいろできます。ここで話していくテキストデータの処理はもちろん、最近流行りの機械学習(ちっとも正しくないけれども世の人に通じやすい呼び方はAI)も、この言語を利用してライブラリを呼び出せば実現できます。これがあれば日常用途はだいたい解決します。めっちゃくやしいですが。惜しむらくは、公式ドキュメントが大してやさしくないことです。あれを読んだだけで物を作れたら君は天才です。今すぐに大学の情報系学科に来るか、会社を立ち上げて億万長者への第一歩を踏み出してください。私とて別に本を読んで学んだわけではありませんが、初学者にとっつきやすそうな本は次の通りです。でも、ここでいきなりポチるより、本屋さんで現物を手にとってパラパラめくってから選んだ方が良いです。最近は私の故郷みたいなクソ田舎のちっこい本屋にもたまに置いてあるようになりましたので。

問題があるとしたら、入門書を読んで学んだだけでは、プログラムとして何を書いたらいいか分からないという点です。日本語の五十音や漢字、主語や述語を学んだだけでは論文や物語が書けないのと同様、作りたいものに向いた思考法や、処理手順規則のようなものを学ぶ必要があります。本連載ではしばらく先でその部分へ入ろうと思います。

2. Rubyプログラミング言語

超大好きです。全人類使いたまへ。

これもいろいろできます。かなり気が効いたメソッド(データを処理するための命令)が豊富に揃っており、Pythonだと面倒な記述が必要な部分でも、Rubyですと1行で済むことは往々にしてあります。ウェブ系プログラミングでは「Ruby on Rails」というフレームワークRubyを利用してプログラムを作るようになっています。惜しむらくは、機械学習系の環境の面ではPythonが世界に覇を唱えていて、Rubyだけでは実質的に機械学習の環境が整わない(整えられなくはないが、Pythonだと数個の手順で済むところを数百個の手順を要してしかも構築失敗しやすい)点があるため、そちらに興味がある人を誘いづらい点にあります。まあ、RubyからPythonやCのライブラリを呼び出す仕組みを利用したり、機械学習のライブラリを呼び出す直前までのデータ整形をRubyで書く(わたしです)などすれば良いのですが……

www.ruby-lang.org

rubyonrails.org

3. AWKプログラミング言語

ja.wikipedia.org

私が初手で使う言語です。

    1. お前Rubyが超大好きだって言ったじゃねえか、初手で使わんのか。
    1. 最近Bashコマンドラインから直接いろいろ書いてデータを刻むようになりまして。

正直に申しまして、この言語をいきなり使う人間は奇怪の具現です。真似をしてはいけません。でも、サーバサイドのプログラミングや保守管理を実施する人は学ぶべきです。仕事の能率が18,446,744,073,709,551,616倍(64ビット)になります。成立が1977年なのでもう46歳です。2年一昔とされる(当社調べ)の情報技術の世界では二十三昔の枯れに枯れたプログラミング言語です。でもバージョンアップが続いています。AWKを使うと、CSVのようなデータを区切り文字で分けて、フィルタリングや集計を実施することができます。手軽ながら強いです。

4. UNIXコマンド群

AWKと組み合わせて、いろいろなコマンドを利用してテキストデータを刻むこともよくやります。UNIXmacOS)やLinuxで利用できます。Windowsでも、WSL(Windows Subsystem for Linux)を利用してLinuxをインストールすると使えます。いくつか出しますと。

  • すぐに使えるもの
    • grep : 特定の語を検索して抽出する。
    • sed : 1行ごとに、与えられた命令に従ってテキストデータを処理する。
    • sort : ファイルの行を指定した一定の基準で並べ替える。
    • uniq : 重複した行を1行にまとめる。
    • join : 2つのファイルについて、指定したフィールドの値が一致するものを結合する。(SQLにおけるJOIN句に類似)
  • 追加インストールで使えるもの
    • jq : JSONJavaScript Object Notation)形式のテキストデータを処理・抽出ができる。
    • xmllint : XML形式のテキストデータを処理・抽出ができる。

このあたりのこともベラベラ喋りたいのですが、連載回的にはしばらく先のことになりそうです。

5. LibreOffice Calc(表計算ソフト)

ここまで来て突然表計算ソフトが出てきましたが、プログラミングがいっちょんわからん(←肥筑方言。共通語訳の一例:まったくもってわからない)人には大変有力、プログラミングがわかる人にも有力な選択肢です。視覚的にデータが処理できるので最高です。でも数百万件もあるデータは扱えないので、その場合はプログラミング言語を学んでいただく必要があります。

次回予告

Pythonを使って郵便番号データをいろいろやります。たぶん。