コマンドラインで脱Excel手作業 フォルダ内の全ファイルでドババンとソートや検索を行う(前編):マウスのいらないコマンドプロンプトの世界
データを順番通りに並び替えたい場合、Excelを起動して、対象となるデータをシートに読み込んで、[編集]グループの[並べ替え]コマンドを実行しているのではないだろうか。ファイルが複数に分かれていると作業がさらに面倒になる。でも、データによってはコマンドを使った方が数倍速く処理できる。コマンドを使って時短しよう。
並べ替えはデータベースやExcelの仕事?
データの並べ替えが必要な場面は意外と多い。データベースやExcelを起動して、ソートを実行することも多いと思う。データによっては、データベースやExcelの起動を待っている間に、コマンドを使ってサックリとソートが実行できる。
ほとんどはExcelで済ますが、全てではない!
データを一定の基準に従って並べ替えるというニーズは、世の中の至るところにある。例えば、入力順の取引データを決済日付順に並べ替えたり、あいうえお順に並ぶ名簿を会員番号順に並べ替えたりするようなケースだ。
こうした並べ替えは、一般に業務システムやデータベース管理システムといったデータを扱うアプリケーション側に機能として組み込まれていることも多い。だが、何らかの理由により自前で並べ替えなければならない事態に直面することもある。
筆者はそうしたとき、ほとんどの場合、「Microsoft Excel(エクセル)」を利用している。ただし「ほとんどの場合」であり、「全ての場合」ではない。なぜならデータの構造や並べ替えの基準によっては、Windows OSのコマンドラインから処理した方が圧倒的に早いからだ。
Excelなら、まず起動してデータを読み込み、[データ]メニューを選択し、表示されるリボン上で[並べ替え]を選択して、ダイアログボックス上で並べ替えのためのキーを指定して並び替えを実行する。その後、[ファイル]メニューから[名前を付けて保存]を選択し、ダイアログボックスでファイル名を指定して保存するという一連の手順を踏む。特に複数のファイルを処理したいような場合は、ファイルごとにこの作業を行わなくてはならず、と意外と面倒だ。
これは、例えるなら鉛筆を削るために多機能で重たい電動工具を引っ張り出してくるようなものだ。目の前の鉛筆1本を削るだけなら、手動の鉛筆削り器やカッターナイフで事足りるし、むしろ手早い。Windows OSのコマンドならば、この一連の作業がコマンドラインをわずか1行記述するだけで片付けられるのだ。これを順番に行うようにすれば、大量のファイルであっても簡単に作業できる。
今回は、まず複数ファイルを処理する前段階として、1つのファイルで並べ替えする方法を取り上げる。
【今回のミッション】
上司から、次のような内容の名簿データが収められたテキストファイルmembers_rnd.txtを渡された。一人分のデータの各項目が、カンマで区切られて1行にまとめられている、いわゆるCSV形式というやつだ。
並べ替える前のCSVデータ
CSV形式のファイルは1行が1件分のデータで、各行のカンマで区切られたそれぞれの範囲を「フィールド」と呼ぶ。例では、「社員番号」「所属部署」「氏名」「スコア」という4つのフィールドから構成されている。
現在は順不同に並んでいるこのデータを、行頭の社員番号の若い順に並べ替えてほしいというのだ。
「そんなの最初から従業員データベースで社員番号をキーにして抽出すればいいのでは?」と進言してみた。
すると「じゃあ、キミがそのようにやっておいてくれたまえ。ヨロシク。ちなみにそれ、社内ボーリング大会のアベレージスコアなので従業員データベースには入ってないのよね」と言われた。
ここはさっさと言われたことを済ませてしまった方が得策。さて、どうやる?
単純な並べ替えならsortコマンド一発で!
今回のミッションは、もちろんExcelでも処理できるが、行頭の社員番号で並べ替えるだけならWindows OSのコマンドの方が手っ取り早い。次の1行で結果がmembers_num.txtに保存される。
sort members_rnd.txt > members_num.txt[Enter]
おそらくExcelの起動を待つ間に、全ての処理が終わってしまうはずだ。実行結果は次の通り。
sortコマンドの実行結果(2)
リダイレクトを使っているので、sortコマンドの実行結果は画面に表示されずファイルに保存される。実行後、moreコマンドでファイルを表示させると、社印番号順に並べ替えられていることが分かる。
このコマンドラインは「sortコマンドにmembers_rnd.txtを読み込み、行頭から文字を比較して、昇順(「0」から「9」、「A」から「Z」の順)でデータを並べ替え、結果をmembers_num.txtというファイルに出力する」というものだ。ちなみに「/R」オプションを指定すれば降順(「9」から「0」、「Z」から「A」の順)で並べ替えられる。
コマンドライン後半の「> members_num.txt」という部分は「結果を画面に出力する代わりに指定したファイルに出力する」という指定だ。このように出力先を切り替える操作を「リダイレクト」と呼ぶ。
前回のこのコーナーで紹介したパイプラインと似ているが、パイプラインは出力結果を受け渡す別のコマンドを指定するのに対して、リダイレクトでは出力先にファイルを指定する点が異なる。
sortコマンドで処理できるデータとは?
では、今回のケースのように行頭に並べ替えのキーがあれば、何でもsortコマンドで処理すればいいのかというと、そうでもない。sortコマンドで処理できるデータは、かなり限定されているからだ。細かく説明し始めると長くなるので大胆かつシンプルにいうと、次の2つの条件を満たしている必要がある。
- 並べ替えのキー(基準)となる文字列が、各行とも行頭から数えて同じ位置にある
- 桁数がそろっている
簡単に説明しておこう。並べ替えのキーは必ずしも行頭にある必要はないが、どの行についても、行頭から数えて同じ文字数の位置に比較対象となるキーが配置されていなければならない。
Copyright© Digital Advantage Corp. All Rights Reserved.