8章cutコマンド

私は取り乱している / あなたに見捨てられたから /

でもチャッキーの腕に抱かれているから寂しくない

—— They Might Be Giants, "Cyclops Rock" (2001)

本章では、ファイルや標準入力を読み込んで、指定した部分だけを切り出すcutコマンドを作成します。切り出されるテキストは、ある範囲のバイトや文字になる場合もあれば、カンマやタブで区切られたフィールドになる場合もあります。「4章 headコマンド」では連続した文字やバイトの範囲を選択する方法を学びましたが、今回は選択範囲が非連続で任意の順序になりえます。たとえば、切り出す範囲として3,1,5-7を指定した場合、3番目の後に1番目、次いで5から7番目までのバイトや文字、フィールドを出力する必要があります。今回のプログラムでは元のプログラムを尊重しつつ、いくつか変更を加えて実装します。

本章では、以下の内容を学びます。

  • csvクレートを使って、区切り文字の含まれるテキストファイルを読み書きする方法
  • *を使った値の参照解決(dereference)†1
  • Iterator::flattenを使って、イテレータから入れ子構造を除去する方法
  • Iterator::mapIterator::flattenを組み合わせたIterator::flat_mapの使い方

[†1] 訳注:「参照外し」と呼ぶ場合もあるが、本書では『プログラミングRust 第2版』に合わせて参照解決とした。

8.1 cutの動作

まずは、BSD版のcutコマンドのマニュアルページのうち、これから実装する機能に関連する部分を見てみましょう。

CUT(1) BSD General Commands Manual ...

Get Rustの練習帳 ―コマンドラインツールの作成を通してRustを学ぶ now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.