固定長データは、[3-1.固定長データとCSVデータとの変換]で述べたように、各レコードの長さが一定のデータをいい、一般的にホストコンピュータやオフコンのデータとして使われています。これに対して、CSV形式をしたファイル(以下、CSVファイルという)には、以下のようにさまざまな種類があります。
フィールドのデータ構造が文字列か数値かにかかわらず、ダブルクォーテーション(")で囲む形式です。ただし、空フィールドは何も書かずにカンマを続けます。
例 "a",,,"bbb","1111","10","125","5555","56","71","iiii","jklm",
フィールドのデータ構造が文字列か数値かにかかわらず、ダブルクォーテーション(")等で囲まない形式です。空フィールドは何も書かずにカンマを続けます。
例 a,,,bbb,1111,10,125,5555,56,71,iiii,jklm,
フィールドのデータ構造が文字列の場合はダブルクォーテーション(")で囲み、数値の場合はダブルクォーテーション(")等で囲まない形式です。空フィールドは何も書かずにカンマを続けます。
例 "a",,,"bbb","1111",10,125,"5555",56,71,"iiii","jklm",
※CSV3形式やK3形式で勘違いしてはならないのは、データ構造とデータの内容の関係です。例のようにデータの内容は、数字の場合("1111"や"5555"など)でもソフトウェア上で「テキスト型」等の文字列としての指定を行っている場合は、ダブルクォーテーションで囲むことになります。したがって、出力されたデータだけを見て、データ構造を推定することは誤りになる場合があるので、注意が必要です。
フィールドのデータ構造が文字列の場合はダブルクォーテーション(")で囲み、数値の場合はダブルクォーテーション(")で囲まない形式です。ただし、空フィールドはダブルクォーテーション(")で囲みます。データベース管理システム「桐」(システム管理工学研究所)で使われているフォーマットです。
例 "a","","","bbb","1111",10,125,"5555",56,71,"iiii","jklm",""
「\1,800」のようにフィールドのデータにカンマ(,)が使用されている場合のみ、「"\1,800"」のように引用符(")で囲む形式です。
以上を表にまとめると下記のようになります。
CSVの形式 | 文字列 | 数値 | 空フィールド |
CSV1形式 | 「"」で囲む | 「"」で囲む | 「"」で囲まない |
CSV2形式 | 「"」で囲まない | 「"」で囲まない | 「"」で囲まない |
CSV3形式 | 「"」で囲む | 「"」で囲まない | 「"」で囲まない |
K3形式 | 「"」で囲む | 「"」で囲まない | 「"」で囲む |
CSVE形式 | データに「,」が含まれていれば「"」で囲む | データに「,」が含まれていれば「"」で囲む | 「"」で囲まない |
このようにCSVファイルにはさまざまな形式があります。ダブルクォーテーション(")で囲まれたデータ中にも「\1,000」のようにカンマを使用するケースがありますが、単純にカンマで分解すると「\1」と「000」に分解されてしまうため、実際のCSVファイルは、「split」関数で単純に分解することはできません。
また、カンマの数も「各項目数と同数を必要とする場合」と「(各項目数 - 1)となる場合」があります。具体的には、項目数が10個ある場合、カンマの数が10個の場合(例1)と9個の場合(例2)があります。一般的には、9個の場合が多いようです。ここでは、カンマの数は、(各項目数 − 1)とします。
例1 a,b,c,d,e,f,g,h,i,j,
例2 a,b,c,d,e,f,g,h,i,j
【付記】
Microsoft ExcelでもCSV形式を扱えるようになっていますが、先頭と最後に空フィールドがあると、空フィールドを削除してデータを保存してしまうことがわかっています。具体的には、例3や例4のようなCSVファイルをExcelで入力すると、例5のようになります。先頭や最後から空フィールドが続くと、データがある項目の手前まですべて削除しているのです。私が確認した限りでは、Excel97とExcel2000、Excel2002でこのような現象が発生しています。したがって、CSV形式を再度、Excelで読み込むとデータが欠落してしまうことになります。データ加工というとすぐExcelを利用する向きがありますが、こうした点を考えても、やはりRubyを利用したほうが安全であるといえるでしょう。
例3 ,,,a,b,c,d,e,f,g,h,i,j,,,,
例4 "","","",a,b,c,d,e,f,g,h,i,j,"","","",""
例5 a,b,c,d,e,f,g,h,i,j
【2009.08.16追記】Excel2007でも同様の現象を確認しています。これはもうExcelの「仕様」というわけですね。