フィールド内改行って何?
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
TwitterのAPIのレスポンスを見ていると、改行コードがCRLFではなく⏎となってるケースがあった。他にもmysqlのフロントエンドツールであるSequelproも、一覧での表示には改行を「⏎」で表現していた。表示上は一行にしたいけど、改行があることを示すときには便利。普段のテキストの中にも出てこなさそう。
デメリットとしては、ASCIIコードにも、SJISにも存在しないのでSJISファイルには保存できない。そしてエクセル向けCSVのデフォルトがSJISなので、エクセル向けのCSVには使いづらい。厳密にはUNICODEのCSVはエクセル向けに作れるんだけど、取扱が難しい。
ASCII制御記号の中から頑張って探す
垂直タブは、XMLの世界からは葬り去られた制御記号だが、まだ生き残ってる制御記号はある。 例えば、0xA0 (NBSP) が存在する。ASCII制御記号でもあるし、SJISでも存在できる。htmlエンティティとして(nbsp;)としても書ける。これもユーザーは入力しない。ただ、普通のスペースとパット見区別できない。見えないというのはかなり厄介。
キリル文字から探す
SJISで存在している、目で見える、めったに使わないということで言えば、キリル文字がある。 「ろしあ」で検索すると候補が出て来る。そして私が新人時代に現場で使っていたフィルド内改行がは「Я」。ヤァと呼ぶらしい。「ロシア文字のRの反対のやつ」と声に出しやすい。「ロシア語の本を作るとき苦労するじゃないですか!」って話もありそうだが、たぶんそのときには、JISのキリル文字は使わないだろう。
キリル文字はJIS X 0208にも定義されているので、SJIS以外のインフラ、例えばIBMメインフレームとかでも使える。オフコンでも使えるので、めちゃくちゃ守備範囲は広い。日本国内に限れば万人にやさしい。
個人的な勝手にフィールド内改行代替記号ランキング
- Я
- ⏎
- 垂直タブ(過去お世話になった)
- パイプ(|)
- おとなしく、普通の改行で正しくCSVパーサーを使う
以下選外 * nbsp (見えない) * LF (見えないしエディタが混乱する)