意図しないデータ変換を防ぐ(CSVファイルをADOで扱う③)


CSVファイルをADOで扱う連載の3回目です。前回の記事はこちらになります

hirocom777.hatenadiary.org

意図しないデータ変換を防ぐ方法

 前回は、ADOを使ってCSVファイルを開くツール(以下CSV_ReaderADO)の概略について説明しました。思っていたよりもシンプルだったんじゃないですか?

f:id:HiroCom777:20210211213852j:plain

今回はCSV_ReaderADO、というよりADOを使ってCSVファイルを開くときに、意図しないデータ変換を防ぐ方法をご紹介したいと思います。CSV_ReaderADOはこちらからどうぞ!!

01_ADOでCSVを扱う.zip - Google ドライブ

ファイルを開いて比べてみる

Excelで開く

 CSVファイルをExcelで開いたときにデータが意図せず変換されてしまう問題は、よく見ることができます。今回は、以下のファイルを用意しました。

03_意図しないデータ変換を防ぐ.csv - Google ドライブ

テキストエディターで開くと内容は以下の様になっています。

ID,START,CLASS,NAME,COMMENT
001,2020-3,1-2,Sato,(1)
002,2021-5,2-5,Yamada,(A)
003,2019-12,13-4,Tanaka,

 まず、このファイルをExcelで開いてみましょう。すると、以下の様になりました。

ID START CLASS NAME COMMENT
1 Mar-20 1月2日 Sato -1
2 May-21 2月5日 Yamada (A)
3 Dec-19 4月13日 Tanaka

 一番上の項目名はいいとして、まず一番左のID列。3桁の数字で表しているはずが先頭のゼロが無くなっています。次のSTART列は開始の時期を年と月で表していると思うのですが、表示形式が変わってしまっています。次のCLASS列はクラス分けを表示したものらしいですが、こちらも日付表記に変換されています。それだけならいいのですが、3行目。'1-2'が'1月2日'、'2-5'が'2月5日'なのに、'13-4'が'4月13日'って何ですか?

 次のNAME列はいいとして、最後のCOMMENT列は1行目の'(1)'が'-1'に変わっています。そういえば、カッコで括った正の数値はマイナスを意味するんでしたっけ。2行目の'(A)'は'(A)'なんだよな。こっちは文字データと認識したみたいです。紛らわしい!!

CSV_ReaderADOで開く

それではCSV_ReaderADOで同じファイルを開いてみましょう。こんな感じになりました。

ID START CLASS NAME COMMENT
1 2020-3 1-2 Sato -1
2 2021-5 2-5 Yamada
3 2019-12 13-4 Tanaka

 あれ?ちょっと様子が違いますね。一番左のID列は同じように処理されていますが、START列とCLASS列は、変換されずに表記されています。問題は最後のCOMMENT列。1行目の'(1)'が'-1'になっているのは同じなのですが、2行目の表記は空っぽです。何なんでしょ?

ADOでCSVファイルを開くときに起こること

 僕なりに考察してみたんですが、ADOでCSVファイルを開くときには以下の処理が行われるのだと思います。

* 読み込んで数値と判断されるデータは数値として変換される。(というか、普通にExcelのセルにマニュアル入力したときの処理。)

  • 日付形式の認識と変換は実施されない。(文字データとして扱う)

  • 異なる形式のデータ(数値と文字列)が列内に存在すると上手く読み込めない。

ということは、数値として変換してほしくないデータは文字列型に固定(ダブルクォーテーションで括る)して、かつ同一列内のデータはデータ形式を統一すれば良いのではありませんか?

CSVファイルの作り方を修正

 それでは、最初のファイルをテキストエディターで修正してみましょう。ID列とCOMMENT列のデータをダブルクォーテーションで括って文字列型に固定します。先頭の項目名も文字列型なので同じようにしておきましょう。以下の様になりました。

"ID","START","CLASS","NAME","COMMENT"
"001",2020-3,1-2,Sato,"(1)"
"002",2021-5,2-5,Yamada,"(A)"
"003",2019-12,13-4,Tanaka,""

 CSV_ReaderADOで開いてみると・・・

ID START CLASS NAME COMMENT
001 2020-3 1-2 Sato (1)
002 2021-5 2-5 Yamada (A)
003 2019-12 3-4 Tanaka

 あ、ちゃんと開けていますね!! ちなみにこのファイルをExcelで開くとこうなりました。

ID START CLASS NAME COMMENT
1 Mar-20 1月2日 Sato -1
2 May-21 2月5日 Yamada (A)
3 Dec-19 3月4日 Tanaka

何も結果は変わっていませんね。

意図しないデータ変換を防ぐファイル形式

 つまり、データ変換を防ぎたい場合はダブルクォーテーションで括って文字列型に固定すればいいということです。極端なことを言えば、全部のデータを文字列型に固定してしまった方がいいと思います。後々予期しないデータが入力、編集されたりすると問題になるからです。今回ご紹介したファイルのデータをすべてダブルクォーテーションで括って文字列型に変換した場合でも、結果は同じことを確認しています。皆さんも試してみてください。

さらなる活用を考える

 いかがでしたでしょうか?ADOを使ってCSVファイルを開くって結構便利じゃないですか?次回はさらなる活用方法について考えてみます。お楽しみに!!

hirocom777.hatenadiary.org

CSVファイルをADOで扱う連載記事はコチラからどうぞ