CSV 編集機能

投稿者: redakt552 声3 投稿

以前から,「CSV エディター」が欲しいと思ってきました。 一言で言えばそれは,Excel や LibreOffice Calc のような表計算ソフトから,(1) データ型,(2) 計算式,(3) フォント・背景色・罫線などの書式,(4) 印刷レイアウト,(5) グラフ化,(6) データベース連携などの機能を取り去ったようなものです。 これらは単に不要なだけでなく,場合によっては CSV 編集を面倒にします。 実際,表計算ソフトを CSV エディターとして使うことがよくあるのですが,「俺が欲しいのは表計算じゃない,CSV エディターなんだ!」と叫びたくなります。 逆にCSV 編集に表計算ソフトを使いたくなる理由としては,(1) 改行を含んだセル値が満足に扱えてほしい,(2) カーソルキーで上下左右に移動したい,(3) 検索で見つけたセルを含む行の左から四番目のセルの値が見たい,(4) 行・列の操作,(5) セル単位のコピペなどがあります。 欲しい機能・仕様を挙げます。一部重複しますが。 ◎セル内改行の表示 セル値が改行を含む場合,そこが改行として表示されてほしい。 ◎表行・表列の固定表示(必須!) スクロールしても第一行は常に表示される,というアレですね。 表計算ソフトから落とした CSV だと,固定したい行が二行だったりするのですが,とりあえず第一行だけでもいいです。 ◎セル内編集モードとセル選択モード(?) セル内にカーソルが立つモードと,セル全体が選択されていてカーソルキーで上下左右に移るモードと。 セル選択モードでは,セル単位でカット,コピー,ペースト,移動(上下左右へ)ができる,と。 ◎行・列の操作 行や列の位置を入れ替えたり。 ◎検索・置換 CSV 編集モードでは,検索・置換をセル単位でやってほしい。つまり,「^★」で検索すれば,セル値が「★」で始まっているセルがヒットしてほしいのです。置換もしかり。 これによって,セル値の先頭・末尾の余計なスペースを削除,といったことがいとも簡単にできます。劇的に作業効率が上がります。 ※厳密に言うと,^ はセル値の先頭ではなく,セル値の行頭(セル値が改行を含む場合は二つ以上ある)です。このことから分かるのは,行頭(^)・行末($)とは別に,文字列先頭・文字列末尾を表す表現が必要だということです。EmEditor の正規表現は Perl 互換ということですが,Perl ってそういうのありましたっけ? ググっても //s オプションで ^ と $ の意味を変えろ,みたいのしか見つけられませんでした。Ruby だと \A と \z でいけるんですが。 また,検索・置換が特定の列・行(複数可)だけでできると嬉しいですね。 ★検討課題 悩ましいのは,列幅ですね。列数の多い CSV を編集するには,列幅を見やすく縮めることが必要ですが,列幅の値を CSV に保存することはできないので,開き直したときにまた設定する必要があります。 解決策としては,(1) 何らかの基準でおすすめの列幅を自動的に提示してくれる機能と,(2) 列幅情報を CSV ファイルとは別に保存しておいて,同じパス名の CSV を開き直したときに前回の設定が生きる,という機能ですかねえ。 もう一つの悩ましい点は,引用符をどうするかですね。 RFC 4180 では,セル値が改行も二重引用符も含まない場合,二重引用符で囲っても囲まなくても構いませんよね。 つまり,CSV の表現は一意には決まらないわけです。 「CSV 編集機能」と銘打つなら,保存時に二重引用符をどうするかの問題は避けて通れないでしょう。 まず,保存のオプションとして (1) すべてのセルを二重引用符で囲む,(2) 二重引用符が必要なセルのみ二重引用符で囲む,の二つは最低限必要でしょう。 でもそれで十分でしょうか? おそらく,(3) 可能な限り元の二重引用符囲みの有無を生かす,が必要だと思います。つまり,もともと二重引用符で囲まれていたセルは保存時もそうする。もともと囲まれていなかったセルは,セル値に改行や二重引用符が含まれる場合のみ二重引用符で囲む,ということです。 理由は二つあって,一つは,CSV ファイルを扱うプログラムライブラリーでは,「a,"",b」と「a,,b」を区別しちゃうものがけっこうあることです。たとえば,Ruby の標準 CSV ライブラリーでは,何もオプションを付けずにこれらの CSV を読み込むと,前者は ["a", "", "b"] になり,後者は ["a", nil, "b"] になります。RFC 4180 的にはおかしいと思いますが,空文字列と nil を区別したいという需要はあるわけですね。 もう一つの理由は編集前後の CSV ファイルをテキスト比較ツールで比較した場合に,セル値を変更していない行は同じ行と見なしてほしいということです。
redakt55 様 いつも EmEditor Professional をお使いいただき、誠にありがとうございます。 ご意見ありがとうございます。詳細については、後ほど、検討させていただきますが、すぐに回答できる以下の点だけ回答したいと思います。 ◎表行・表列の固定表示 これは、実装する予定です。 ◎検索・置換 指定する列のみから、置換することは可能です。指定する列を箱型選択してから、置換ダイアログで、「選択範囲のみ」をチェックして置換します。選択範囲のみの検索はできないのですが、それは検討させてください。 ◎二重引用符 EmEditor は、基本的には、ファイルの開く/保存時には、二重引用符を追加したり削除したりしません。ファイルにあるものが、そのままエディタに表示されます。ただし、新しいバージョンでは、CSV/TSV/DSV の変換機能を追加する予定です。そうすると、TSV から CSV への変換時に、セル内にカンマか二重引用符が含まれている場合には、そのセル全体を二重引用符で囲むという実装が必要になります。そのため、CSV/TSV/DSV の変換時には、二重引用符を追加する必要性が出てきます。逆に、変換時に、二重引用符を必要以上に削除するべきかどうかの議論の余地はあると思います。 あと参考までに、もう1つの例外的な実装として、並べ替え各種コマンドの場合があります。現在、並べ替えの各種コマンドの場合には、指定する列に対してソートすることができますが、その場合は、二重引用符を無視してソートが働くようになっています。 EmEditor は、巨大ファイルをスムーズに開いて編集することが第一の目的のため、速度が犠牲になるような実装は行うべきではないと思っています。その意味からも、二重引用符の処理といった、時間がかかるようなコードはできるだけ実装したくないと思っています。 ご意見ありがとうございました。他にも何かご意見がありましたら、ご連絡ください。 どうぞよろしくお願い申し上げます。
14.6.0 のベータ版を触ってみましたが,やはり「CSV のセル単位の置換」機能はぜひとも実現してほしいですね。置換ダイアログに「セル単位」といったチェックボックスでも付けて。 CSV データを整えたいという需要は非常に高いと思うんです。 繰り返しになりますが,セル値の先頭・末尾の余計なスペースを削除するとかですね。 Ruby や Python,Perl のようなプログラミングができる人なら,言語に付属の CSV ライブラリーを使っていとも簡単に CSV データの加工ができます。 でもそれができないのでテキストエディターでなんとかしたい,という人は大勢います。 セル値が改行やカンマを含まないなら,正規表現でどうにかなりますが,それらを含むなら極めて難しくなります。 この穴を EmEditor に埋めてほしいんです。 もう一つ例を挙げます。 たとえば,セル値が abc,def だったとします(カンマは全角)。 このカンマを半角カンマ+半角スペースに置換したいとします。 置換したときに "abc, def" のようにダブルクオートが付くことを期待しますが,現状では付いてくれません。 RFC 4180 的に正しい CSV を CSV モードで開いているにもかかわらず,置換して保存すると,部分的に列のずれた CSV だったり,RFC 4180 で解釈できないデキソコナイになってしまうのです。 これでは危なっかしくて CSV 編集に使えません。 将来のバージョンでもいいので,「編集時に CSV らしく表示する機能+α」でなく,「CSV データとして編集する機能」をぜひともご検討いただきたく。

このトピックの投稿: 3