Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

(エクセルで作成した csv ファイルについて)一つのセルに書かれている複数の行を、テキストエディタ Emacs で一つの行で見れるようにする方法

1. はじめに

エクセルで作成した csv ファイルで一つのセルの中に複数の行の記載があるファイルは、よく見かけると思います。今回の記事では、この csv ファイルをテキストエディタ Emacs で開き、一つのセルに書かれている複数の行を一つの行で見れるように変換する方法を書きます。さらに、変換したあと逆変換し元に戻す方法も書きます。使用するエディタは Emacs です。

2. 注意事項、制限

以下の csv では正しく動作しません。
- CRLF(キャリッジリターン + ラインフィード)以外で、 CR(キャリッジリターン)を使用している csv ファイル

※変換、逆変換するときに CR を区切り文字として使用するため、 CR を単独で使用している csv ファイルの場合、正しく動作しません。

3. 入力ファイル

3.1. エクセル

以下の様なデータをエクセルで作成します。2行目のA列のセルと2行目のB列のセルが複数行になっています。これを csv で保存したものが入力ファイルです。

f:id:keimina:20190731224004p:plain

3.2. 入力ファイルの初期状態

入力ファイルを Emacs で開くと以下の様に表示されます。^M と表示されているのは CR(キャリッジリターン)を表す文字です。LF(ラインフィード)は改行として表示されています。

f:id:keimina:20190731224102p:plain

4. 方法

複数行から1行への変換、1行から複数行へ変換する具体的な方法は以下の通りです。Emacscsv ファイルを開き以下のような手順を実行すると複数行、CR(キャリッジリターン)区切りの1行にできます。理論については「5. 背景、理論」に記載しました。

4.1. 1行への変換

複数行から1行へ変換するには以下を行います。

4.1.1. 検索する正規表現

検索する正規表現を入力します。

f:id:keimina:20190731224137p:plain

4.1.2. 置換のための emacs lisp

置換するための文字列として emacs lisp 式を入力します。

f:id:keimina:20190731224208p:plain

4.1.3. 置換実行後

置換実行後の状態です。複数行になっていた箇所が、CR区切りでスッキリと1行にまとまりました。

f:id:keimina:20190731224234p:plain

4.2. 複数行への変換

1行から複数行へ変換(逆変換)するには以下を行います。

4.2.1. 検索する正規表現

検索する正規表現を入力します。

f:id:keimina:20190731224349p:plain

4.2.2. 置換のための emacs lisp

置換するための文字列として emacs lisp 式を入力します。

f:id:keimina:20190731224419p:plain

4.2.3. 置換実行後

置換実行後の状態です。入力ファイルの初期状態に戻りました。

f:id:keimina:20190731224445p:plain

5. 背景、理論

エクセルで作成した csv ファイルは、セルの中の改行は LF で、そうでない改行(個々のサンプルを隔てるための改行)は CRLF で表されるようです。今回は LF で記載された複数の行を一つにすることが目的なので、Emacs に表示されている CRLF を普通の改行に、普通の改行を CR に変換すればよさそうだと考えました。すなわち CRLF を LF に LF を CR に同時に変換するということです。そして、そうやってできたデータを元に戻す、逆の変換には、LF を CRLF に CR を LF に変換すればよさそうです。このような変換は、一般的にはプログラミング言語を使うと正規表現のグルーピングを用いた置換で実現できると思います。テキストエディタ Emacs では、正規表現で指定した文字列を置換するための文字列として emacs lisp 式を使用することができます(「バックスラッシュ+カンマ+式」の形式で記載します)ので、こちらを使用して置換しました。

6. まとめ

テキストエディタ Emacs を使用して、csv で一つのセルに書かれている複数の行を CR 区切りで一つの行として見れるように変換しました。さらに、それを逆変換し元に戻しました。

以上です。おやすみなさい。