[Zaurus] あまりにも無謀!シェルスクリプトでcsvファイル編集!~CUI偏愛主義のなれの果て
1月25日の日記で、「ヴィッセル神戸所属選手一覧は、csvファイルのままメンテする」なんぞと宣言しましたが、さりとて適当なツールがありません。ともかく、Zaurusだけでやりたいんです。csvファイルというのは、テキストファイルだからエディタで直接編集可能であるはずなんだけど、扱いにくいフォーマットです。どういう点が扱いにくいかというとデータをエディタで見たとき、どのデータが何列目のデータかさっぱり分からない。特に空セルが多いと、カンマの羅列で数えるのがすごく面倒。列の追加なんて、もってのほかの面倒臭さソートするのも面倒と言った所ですね。カンマの数を数えるとか、ソートとかいった単純作業ならコンピュータにさせるべき。でもそのたびにスクリプトを書くのも面倒臭い。ということでちょっと(だけ)汎用的なシェルスクリプトを書いて見ました。普通、こんなことするならもう少しましな道具(perl?Ruby?emacs-lisp?)を選ぶんでしょうけど、何せ私が理解可能なのはせいぜいシェルスクリプト。練習もかねて、いろいろ試行錯誤しながら書いて見ました。で、これが思ったよりはるかにまともな速度で動きます。遅く思うでしょうけど、例の所属選手一覧のcsvファイルをそこそこの速度で扱えます。画面表示に時間がかかるのは、w3mでのhtml解釈の時間ですので、私の力ではどうしようもありません。本当は人様にお見せできるような代物ではないのですが、前に書いた >ほんのささいな事でもいいから、自分で書いたプログラムで >何かをさせてみる。C言語でなくてもスクリプトでもいい。 >そんなことがが手軽に試せることこそが、Linuxを使う大きな >楽しみだと思うんですを実践し、皆さんに見ていただいて笑いを取る、もとい『あ、これなら私でもできるかも?いや、こいつよりはずっとまともにできるはず!』とか思ってもらって、Linuxファンを増やす一助になればと思い、恥をさらすことにしました。このスクリプトはあくまで、テキストエディタの補助ツールとして作りました。これだけで本格的な編集をする積もりはありません。最初に上げたcsvファイルの扱いにくさを軽減するためのものです。機能説明ここからダウンロードして、中から二つのスクリプトを取り出し、パスの通っているディレクトリに置いてください。私は/usr/local/binに置いています。このスクリプトは2段構成になっています。b4csv csvビューア フロントエンドとしてw3mを使用e4 操作ツール b4csvから呼び出すまずb4csvですが、 b4csv csvファイル名 [-w 作業ディレクトリ名]とやって起動します。[]内は省略可能。省略するとカレントディレクトリに一時ファイルを作成します。機能としては、csvファイルを読み込んで、html形式に変換してw3mで表示する行番号、列番号を追加しているだけです。スクリーンショットをご覧ください。Rxxが行番号、Cxxが列番号です。e4はb4csvの中からビューアとして起動されているw3mの、!コマンド(シェルコマンド実行)からコマンドラインで呼びます。スクリプトファイル名は適当に変えても大丈夫です。 e4 オプション 引き数各機能のオプション/引き数の指定は以下の通りです。ヘルプ-h 使い方を表示指定セルに文字列書き込み-i 行,列,[,書き込み文字列] セル位置は 行と列を数字で表記。 書き込み文字列中に","(カンマ)や" "(半角スペース)を 含む場合は文字列全体を""(ダブルクオーテーション 記号)で囲む。但し、","はセル内に1個のみ 書き込み文字列を省略した場合は、後で聞いて くるのでその時入力 なお、半角スペースとカンマを含む文字列を入力する 時は、コマンドラインでは文字列を省略するソート-s 第1ソートキー列番号[,第2キー,第3キー] 列番号指定は、2桁以下の数字。 数字の直後に"r"を付けると降順ソート 標準状態のZaurusでは第2キー以降は無視される 例) e4 -s 3,15,6r 第3列を第1キーとして昇順、 第15列を第2キーとして昇順、 第6列を第3キーとして降順、でソート列追加/削除-c 追加開始列位置[,追加列数][,f] 追加列位置は2桁以下の数字、追加列数も2桁以下の数字 但し、追加によって列数が99を越える場合は実行されない 追加列数が負の値の時は削除 追加の時にfを指定すると、追加した列の各セルには 列2番号が入力される行追加/削除-r 追加開始行位置[,追加行数][,f] 追加行位置は3桁以下の数字、追加行数も3桁以下の数字 但し、追加によって行数が999を越える場合は実行されない 追加行数が負の値の時は削除 追加の時にfを指定すると、追加した行の各セルには 列番号が入力されるcsvファイル更新-w (引き数指定無し) 編集操作の結果を、編集元のcsvファイルに反映させる 元のcsvファイルはバックアップとして作業ディレクトリに保存アンドゥ-u (引き数指定なし) 直前の操作結果を無効にできますこれらのコマンドを実行して、w3mに戻ったら"R"キーを押して画面を更新してください。コマンド実行結果が反映された画面が出ます。これら編集結果は、-wコマンドを実行するまではテンポラリファイルに記録されます。また編集結果を-wコマンドで元ファイルに書き込むまでは、左上のセルが『===』と表示されます。ソートについては数字だけの列ならうまく行くと思います。それ以外があると多分だめでしょう。数字、アルファベット、日本語の混在したデータを期待どおりにソートするのは至難です。またZaurusに入っているsortコマンドはあまりにも機能が削ぎ落とされていているので、なんとかソートキー1個だけをサポートしました。Zaurusでも ・-tオプションと-kオプションをサポートしたsortコマンド ・nlコマンドを入れてやればPC用Linuxと同じ、多キーソートが出来る(はず)です。その場合は、b4csvの93-95行目をコメントアウトしてください。動作環境動作に必要なコマンド等。(SL Zaurusに初期状態で入っていない物)ソフト名動作確認に使ったバージョンターミナルソフトqpe-embeddedkonsole-ja 1.6.0-jinput3w3m0.5.1+async-1nkf2.03-1えーっと、sedってZaurusに入っていましたっけ?sedも必要です。でも標準で入っているような気もするので、上に挙げていません。PCのLinuxでも動作すると思いますが、ターミナルの文字コードはEUCにしてください。また日本語の一杯入ったcsvファイルを扱われる場合は、sedとgrepは日本語対応の物を使われることをお勧めします。制限事項既知の制限事項一つのセル内にカンマが1つだけある場合は動作すると思います。ただし、そのセル要素全体が""で囲まれている必要があります。csvファイルの日本語コードはSJISのみを扱います。ただし、内部的にはEUCで扱っています。ファイル名に日本語などのマルチバイト文字を含む物では動作しないかも知れませんしません。丸数字、ローマ数字などのいわゆる機種依存文字は動作しないかもしれません。列数は99までを想定しています。それ以上も不可能ではないですが、Zaurusで扱うのは非現実的と思います。行数は999までです。@@@,@C@,@D@,@S@は予約文字となっています。これらの文字列を含むファイルでは、正常動作しない可能性があります。{li>csvファイル自体には各行の要素数に制約はないはずですが、このスクリプトでは全行が同一要素数をもっている物と想定しています。もともと表を作るのが目的だからです。未知の制限事項恐らく、多数あるでしょう。半角スペースやカンマ、ダブルクオーテーション記号やクオーテーション記号を含む文字列の入力は多分完全にはカバーできていないと思います。配布条件まさかこれを本気でお使いになる方はいらっしゃらないと思いますが、念のためお約束の文言を添えておきます。本シェルスクリプトは無論、フリーです。本シェルスクリプトは無保証、無サポートです。本シェルスクリプトを使用してのいかなる結果にも作成者は責任を負いません。バグはご連絡くださればありがたいですが、修正のお約束はできません。著作権は私、亜邦人が保有します。ということで、ま、お笑いください。あ、中のスクリプトの書き方はださださなので、決してまねしないように。(する人はおらんって)