山本ゆうごブログ

山本ゆうごの仕事メモ

最強のフィールド内改行

フィールド内改行って何?

CSVファイルを作っていて悩ましいのが、フィールド内改行。

例えばこんなの

"ユーザーID","ニックネーム","プロフィール"
"tomo1215","ともちゃん","趣味はたべあるき。カワイイもの大好き"
"btspen03","あきちゃん","とにかくBTS大好き
2001line"

3行目の「あきちゃん」のプロフィールがやっかい。プロフィールの中に改行が入ってるから。

CSVの仕様としてはどうよ?

CSVの仕様としては、ダブルクォーテーションで囲まれていれば改行が入っていてもいい。いいんだけど、パースする方がちょっと大変。

エクセルは LF

エクセルはずるいことに、レコード区切はCRLFにしていて、フィールド内改行はLFにしている。だから文字コードレベルでは区別ができる。がしかし、テキストファイルで改行コードが混在するのってめちゃくちゃ面倒。超しんどい。エディタで開いて保存しなおしたらなら、どっちかに統一されかねない。

ファイルメーカーは垂直タブ

垂直タブ(0x0B)というASCIIコードの制御文字がある。エディタによっては、反転したKみたいな化け方をする。Macで昔から有名なファイルメーカーは、垂直タブでフィールド内改行を表現するので、非常にテキストファイルのやりとりがしやすかった。

ただ、この垂直タブ、今ではマイナー。XMLの中にはデータとして保持できなくて、XMLパーサーがエラーを吐いちゃう。超残念。「垂直タブ」って名前からしてフィールド内改行に使っても良い気がする。

完全に独自の文字にしちゃうという案

フィールド内デリミタとして登場しがちなパイプ「|」

そもそも、CSVがカンマ区切であり、フィールド内に何らかのデリミタを用意したいとうケースは有る。よく見るのはパイプ「|」。ただ、ユーザーがパイプを使いたくなったらどうするんだ?って疑問は出て来る。

ユニコード絵文字としてのリターン記号 「⏎」

https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3%E8%A8%98%E5%8F%B7

TwitterAPIのレスポンスを見ていると、改行コードがCRLFではなく⏎となってるケースがあった。他にもmysqlのフロントエンドツールであるSequelproも、一覧での表示には改行を「⏎」で表現していた。表示上は一行にしたいけど、改行があることを示すときには便利。普段のテキストの中にも出てこなさそう。

デメリットとしては、ASCIIコードにも、SJISにも存在しないのでSJISファイルには保存できない。そしてエクセル向けCSVのデフォルトがSJISなので、エクセル向けのCSVには使いづらい。厳密にはUNICODECSVはエクセル向けに作れるんだけど、取扱が難しい。

ASCII制御記号の中から頑張って探す

垂直タブは、XMLの世界からは葬り去られた制御記号だが、まだ生き残ってる制御記号はある。 例えば、0xA0 (NBSP) が存在する。ASCII制御記号でもあるし、SJISでも存在できる。htmlエンティティとして(&#nbsp;)としても書ける。これもユーザーは入力しない。ただ、普通のスペースとパット見区別できない。見えないというのはかなり厄介。

キリル文字から探す

SJISで存在している、目で見える、めったに使わないということで言えば、キリル文字がある。 「ろしあ」で検索すると候補が出て来る。そして私が新人時代に現場で使っていたフィルド内改行がは「Я」。ヤァと呼ぶらしい。「ロシア文字のRの反対のやつ」と声に出しやすい。「ロシア語の本を作るとき苦労するじゃないですか!」って話もありそうだが、たぶんそのときには、JISのキリル文字は使わないだろう。

キリル文字JIS X 0208にも定義されているので、SJIS以外のインフラ、例えばIBMメインフレームとかでも使える。オフコンでも使えるので、めちゃくちゃ守備範囲は広い。日本国内に限れば万人にやさしい。

個人的な勝手にフィールド内改行代替記号ランキング

  1. Я
  2. 垂直タブ(過去お世話になった)
  3. パイプ(|)
  4. おとなしく、普通の改行で正しくCSVパーサーを使う

以下選外 * nbsp (見えない) * LF (見えないしエディタが混乱する)