CSVを表計算ソフトで扱う場合によく起こりがちな意図しない文字変換とその対処
仕事柄、CSV形式のデータをシステムにインポートする作業を行う事があり、このCSVデータを用意する際に表計算ソフトでCSVの編集をする。が、この過程で、表計算ソフトによってCSVの値が意図せず変換される事がある。これで結構つまづく事が多いので、今後の為に想定されるケースと対処法をまとめておく。
次は、今回紹介するケース。
- A.(Excel)マルチバイト文字(日本語とか)が文字化けする
- B.(Excel)桁数の多い数値が10進表記から指数表記(「1.12001+E13」とか)に変換される
- C.(Excel,LibreOffice)電話番号など「0」から始まる数値の頭の「0」が無くなる
- D.(Excel,LibreOffice)「0」の連続が「0」1文字に変換される
なお、次は今回のケースを確認する為のサンプルCSV。
name,date,password,tel 山田太郎,20171212000000,passw0rd!,09012345678 山田 花子,20181007000000,00000000,07025252525
これを文字コードUTF-8でCSVとして保存した後、今回紹介するケースが全て出現している事が確認できる。
ケース別の対処法
A.(Excel)マルチバイト文字(日本語とか)が文字化けする
LibreOffice とか文字コード非依存のCSV編集ツールを使う。
なお、Excelもメニューの「データ>テキストファイル」から読み込めばSJIS以外のファイルを扱えるようだが、LibreOfficeを使う方が安直。
B.(Excel)桁数の多い数値が10進表記から指数表記(「1.12001+E13」とか)に変換される
C.(Excel,LibreOffice)電話番号など「0」から始まる数値の頭の「0」が無くなる
D.(Excel,LibreOffice)「0」の連続が「0」1文字に変換される
以降のa,bを留意することで対応できる。
a.カラムの表示形式を指定する。
ファイルを開いた状態の場合は、セルの書式設定から表示形式を指定する事で改善できるものがある。
例えばB.の指数表記の件は、表示形式を文字列(テキスト)にする事で改善する。
ただ、C.の電話番号の場合はこれで改善できない場合がある。この場合、LibreOfficeで次のように対処できる。
LibreOfficeでは、ファイルを開く際に、次のようなダイアログが開いて、どのように開くか設定を事前に細かく指定できる。
設定の中に項目「Fields>Column Type」があり、そこで表示形式を「Text」に設定する事でカラム値の先頭の「0」が省略されずに開ける。
b.CSVデータの本体は、書式を保持可能な表計算ソフトのファイル形式で保存しておく。
元のCSVデータは表計算ソフトの標準のファイル保存形式(Excelなら.xlsx,LibreOfficeなら.ods)で保存しておき、編集する際はそれに対して行う。
実際にインポートを行う場合に表計算ソフトのメニューから「コピーを保存」をクリックして、CSVとしてエクスポートする。
なぜCSV形式で保存しないかというと、カラムごとの書式指定を保持できず、再度表計算ソフトで開こうとするとまた意図しない文字列変換が起きる為。
最後に
最近はまだ試せてないけどVS CodeでCSV編集できる拡張機能(「Edit CSV」と「Rainbow CSV」が有名な模様)があるので、そっちを使った方がよいのかも。