モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

ExcelのCSV読み込みでセル内改行がある場合

セル内に改行があるCSV

"111","aaa"
"222","bbb
ccc"

のように「"」でくくってやれば表現可能です。


しかしセル内改行がある場合にExcelで読み込むと、セル内改行で切れてしまい表が崩れてしまう、という問題が起こりました。


実は最初にそのCSVを吐き出すモジュールを作成した時のテスト時にはうまくいっていたので、その後の修正でバグが混入したのだろう、ということで調査しました。

すると、出力するファイル名拡張子が「.csv」だったものを、後から出た要望で「.txt」に変更していたことがわかりました。


Excelは、拡張子が「.csv」の場合だと何も聞かずにCSVとして読み込んでくれるのですが、「.txt」の場合だとCSVや固定桁フォーマットのテキストを読み込むためのウィザードを動かしてそれで読み込みます。

ウィザードの場合でも「"」でくくられたCSVを読むことはもちろん出来るのですが、レコードを先に必ず改行で切ってしまってからパースするため、「"」でくくられている中に改行があってもそこでレコードは切れてしまうのです。


なので、状況を説明して変更された拡張子「.txt」を「.csv」に戻してもらうことで対応することになりました。


ちなみにExcelでセル内改行したものをCSVで出力すると、改行コードを可視化して表示すると

"111","aaa"\r\n
"222","bbb\n
ccc"\r\n

のようにセル内改行は「\n」のみで表現されています。

最初はこの違いのせいかと思ったのですが、セル内改行が「\r\n」になっている場合でも、拡張子が「.csv」であれば正しく読み込めます。
逆に、Excelが吐いたファイルでも拡張子を「.txt」に変更してしまうと、正しく読み込めなくなります。


(追記)

セル内改行コードを最初「\r」と書いてたのですが「\n」の間違いでしたので修正しました。
@tmtmsさんと@kotyさんに指摘頂きました。ありがとうございます!