CSVファイルをADOで扱う連載の3回目です。前回の記事はこちらになります
意図しないデータ変換を防ぐ方法
前回は、ADOを使ってCSVファイルを開くツール(以下CSV_ReaderADO)の概略について説明しました。思っていたよりもシンプルだったんじゃないですか?
今回は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ファイルを開くって結構便利じゃないですか?次回はさらなる活用方法について考えてみます。お楽しみに!!