特異な現象

昨日の「CSV」という語が使われたログデータの中からいくつか代表例を標本抽出してみた。総数はこの何十倍もの量があるがその抜粋である。
LOG
122.249.242.240 [09/Aug/2016:07:46:07] エクセル CSV 段落 なくす
124.140.181.121 [09/Aug/2016:08:03:43] CSV 改行コード 例
121.119.250.97 [09/Aug/2016:09:42:52] CSV 改行コード 変換 EXCEL
133.250.236.49 [09/Aug/2016:10:31:26] CSV 折り返し
210.173.158.194 [09/Aug/2016:10:45:54] CSVファイルで数値を文字列に変換
180.43.8.247 [09/Aug/2016:11:55:30] export-csv 改行
150.61.31.77 [09/Aug/2016:14:21:14] csv ファイル 選別
選別の意味が不明。
210.160.8.65 [09/Aug/2016:15:05:25] Excelマクロ csv 改行コード
202.74.253.40 [09/Aug/2016:15:05:31] excel csv 変換 改行
202.246.252.97 [09/Aug/2016:15:44:46] 改行 vba csv 書き込み
153.193.72.171 [09/Aug/2016:16:16:08] CSV 改行
114.160.237.62 [09/Aug/2016:17:30:16] csv セル内改行
126.24.17.5 [09/Aug/2016:18:53:12] Excel CSV 改行コード
49.98.167.206 [09/Aug/2016:19:26:06] csvファイル 加工
加工の意味が不明。
210.248.150.106 [09/Aug/2016:19:27:22] エクセル CSV "" 削除
49.106.208.26 [09/Aug/2016:21:57:00] vba CSV セルの指定した時間の行を削除
この中からCSVファイル(拡張子が.csv)でないもの、すなわち単にエクセルのシート上のデータをCSVと書いている例を除外する。また、意味が不明のものも除外する。上の青色の部分は問題外になる。
LOG
124.140.181.121 [09/Aug/2016:08:03:43] CSV 改行コード 例
121.119.250.97 [09/Aug/2016:09:42:52] CSV 改行コード 変換 EXCEL
210.160.8.65 [09/Aug/2016:15:05:25] Excelマクロ csv 改行コード
202.74.253.40 [09/Aug/2016:15:05:31] excel csv 変換 改行
202.246.252.97 [09/Aug/2016:15:44:46] 改行 vba csv 書き込み
153.193.72.171 [09/Aug/2016:16:16:08] CSV 改行
126.24.17.5 [09/Aug/2016:18:53:12] Excel CSV 改行コード
210.248.150.106 [09/Aug/2016:19:27:22] エクセル CSV "" 削除
そのほとんど全部は「改行」がらみであることがわかる。これは特異な現象だともいえるが、大型のホストコンピューターとのデータの相互利用を想定したものであることは容易に想像がつく。Excelではどの改行コード(CR/LF/CRLF)であっても改行と認識する。改行などを考慮する必要がない。しかし、ホストコンピュータ(たぶんUNIX系のマシン)は改行は「LF」だからである。それ以外にエクセルバカが「改行」などを持ち出してもしょうがないはずである。また能もないから何にもできないはずである。

となるとエクセルバカのアクセスが「CSV」と「改行」に集中してくるのも「むべなるかな」である。能のないオトコたちのただの「改行バカ」だが、ある意味では本来の表計算ごっこの「お仕事」をしているとも評されるからである。むげに低能のオンパレードだと「こきおろす」のも若干気がひける(笑)。バカはバカなりに必死なのだろう。


CSVファイル

CSVファイルは、Excelなどの表計算ソフトやAccessなどのデータベースソフトとのデータの相互利用を可能にするファイル形式である1)。実際は各データがカンマ「,」で区切られた単なるテキストファイルである。C言語などではCSVファイルに対しては特別の配慮(取り扱い)をしていない。単なるテキストファイルのひとつでしかない。
NOTES
1) または、CSVファイルはデータベースや表計算ソフトのデータをテキストファイルにしたものだといってもよい。

C言語を覚え始めた頃はCSVファイルという概念は存在していなかった。または一般にはそんなものはまだ認知されていなかった。そんなものは使わなかったといってもよい。したがって、CSVファイルの作成はともかく(それがCSV形式だと知ったのはもっと後だが)CSVファイルの読み込みなどはやったこともなかった。

なお、C/C++言語ではどんな改行コードのファイルであっても読み込めるし、どんな改行コードにしても書き出すことができる。その点ではエクセルバカのように「改行」を特別扱いしてそれで悩むことはない。単なるテキストファイルの処理にすぎない。


初めてのCSVファイル作成

CSVファイルをはじめて作ったのは、昔あった三洋証券のパソコン株式取引システムの「PASSPORT」の株価データ(これは非CSVのテキストデータだった)を、昔あった表計算ソフトの「ロータス1-2-3」に取り込むためにCSVファイルにする必要があった時である。記憶は定かではないが、1986年頃か。これは単純なテキストファイルの処理で決着がつく問題だった(もちろんC言語による)。

三洋証券のパソコン取引の株価データ(元ファイル/CSVファイルではない)

1990/01/17 4,450 4,560 4,410 4,500 124.2          

このパターンのデータが日付毎に行単位で羅列している。各データはスペースまたはタブで区切られていた。

CSVファイル(変換後ファイル/ロータス1-2-3に合わせて数字の配置が変わっている点に注意)

1990/01/17,4560,4410,4500,4450,124.2          

これをするためには、まず途中で一度次のような形に変形する必要がある(一時ファイルとして作成する)。
数値の中に出てくるカンマ「,」を削除することが絶対に必要になる。

1990/01/17 4450 4560 4410 4500 124.2          

以下省略。


初めてのCSVファイルの読み込み

初めてCSVファイルの読み込みをやったのは、あるところから頼まれて作ったipc_0036のような場合である。そんなことでもなければCSVファイルの処理などはしなかっただろう。私の場合は今までそんなものを使う必要がなかったからである(今でも使わない)

C/C++言語では、CSVファイルに特別の配慮はしていない(それに直接使える関数などがない)から、扱いにくいことは確かである。相手にCSVファイルのデータ形式を見せてもらって、たとえば各フィールドのデータが「""」で囲まれているかいないか、カンマがその「""」の中にあるかどうか、などをチェックして、このCSVファイル読み込みとデータの処理をどうするかは結構考えたものである。

あの時は正常に動作していたから、別に大きな間違いはなかったと思う。動作不全のクレームもこなかった。ただし、それが最良の方法であるかどうかは別問題である。改良の余地は当然あるだろう。


あの時(2000年頃/今から15年以上も前の話)は、CSVファイルは(記憶は定かではないが)、カンマ区切りで各フィールドはどれもダブルコーテーションで囲まれていた。金額を表わす数値にはカンマは使われていなかった。

ソースを見てみると、CSVファイルの各フィールドの読み込みに際して、strtok関数を使って必要なデータが出てくるまで不要なフィールドのデータは読み飛ばすという方法を使っていた。不要なフィールドデーターが多かったのかもしれない(推測)。これはどれもダブルコーテーションで囲まれていたから可能な方法だった。

しかし、この部分はscanf系の関数(sscanffscanfなど)を使って一括してフィールドデータを取得することもできた。下記はその実験例である。


メモ
このソースはtpc_0286_1.cppを参照。
今となってはこの方がよかったかもしれない。
とはいっても、もうすんだ話であるが(笑)。


CSVファイル処理の実例/個別業務用データ(win_0464)
CSVファイル処理の実例/郵便番号と住所データ(ccp_0050)


CSVファイルを使わなかったのは

その当時はCSVファイルを使う必要性がなかったからである。ExcelAccessなどのソフトを使ったのはもっと後である。もっとも、これらのソフトを使っていても、CSVファイルを使うことは個人的にはあまりなかった。ただし、データの有効利用という点では使うことはあった。CSVファイルを介してソフト間の互換性を確保することは多かったからである。

また、C言語にはCSVファイルに使えるような関数もなかった。それで、わざわざ扱いが面倒なCSVファイルを読み込んで使うという気が起こらなかった。処理が面倒になるだけだったからである。

しかし、CSVファイルと同等のことは構造体を使ったバイナリーファイルという形で実行していた。これはC言語的には実に使いやすく便利なファイルだった。もちろん今でもよく使う方法である。単純なテキストデータ(たとえば先の三洋証券の株価データのようなもの)をこれに変換して使うことはよくやっていた。

この具体的方法の詳細は「バイナリーとテキストの相互変換(ccp_0007)」を参照。この形のバイナリーファイルで十分だった。要するに、外部とのデータの交換ということがなければCSVファイルは使う必要がなかったのである。

その反面、そういうデータを他人に渡す場合は、そんなある特定の処理・プログラムに特化したようなバイナリーファイルでは相手には意味がない。それでなかば共通の土俵として認められていたCSVファイルにして渡すことが多くなる。この「バイナリファイル→CSVファイル」の変換は簡単にできる。これはBASICでも同じである。ただし、そんな場合でも自分がCSVファイルそのものを使うことはなかった。CSVファイル自体はデータ処理の目的ではないということである。

- 2016/08/10 -



Windows 8.1までの時は、*.csvファイルはエクスプローラーから拡張子起動する場合はExcelに関連付けられていたように記憶しているが、Windows 10では*.csvを読み込むソフトの既定のリストの中にはExcelは出てこない(Wordは出てくる)。変ったな、進歩のないこのMicrosoftの世界も(笑)。


タコの殿堂
CSVに寄ってくる 人目のオバカ(since 2018/06/17)。