■Windows版Rubyの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Rubyの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
    3. [3.応用編]
      1. [3-1.固定長データとCSVデータとの変換]
        1. [3-1-1.固定長データとCSVデータ]
        2. [3-1-2.固定長データをCSVデータに変換する]
        3. [3-1-3.CSVデータを固定長データに変換する]
        4. [3-1-4.固定長CSVデータを固定長データに変換する]
        5. [3-1-5.固定長データを固定長CSVデータに変換する]
        6. [3-1-6.固定長CSVデータをCSVデータに変換する]
        7. [3-1-7.CSVデータを固定長CSVデータに変換する]
      2. [3-2.重複データの処理]
      3. [3-3.フォルダ内の一括処理]
      4. [3-4.1つのファイルを複数のファイルに分割する]
      5. [3-5.文字コードの変換]
      6. [3-6.半角全角変換]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
    4. [スクリプトと入力データのサンプル]
Perlではどう処理する?
同じことをPerlではこうしています。

3.応用編

3-1.固定長データとCSVデータとの変換

3-1-1.固定長データとCSVデータ

固定長データは、[3-1.固定長データとCSVデータとの変換]で述べたように、各レコードの長さが一定のデータをいい、一般的にホストコンピュータやオフコンのデータとして使われています。これに対して、CSV形式をしたファイル(以下、CSVファイルという)には、以下のようにさまざまな種類があります。

■CSV1形式

フィールドのデータ構造が文字列か数値かにかかわらず、ダブルクォーテーション(")で囲む形式です。ただし、空フィールドは何も書かずにカンマを続けます。

例 "a",,,"bbb","1111","10","125","5555","56","71","iiii","jklm",
   
■CSV2形式

フィールドのデータ構造が文字列か数値かにかかわらず、ダブルクォーテーション(")等で囲まない形式です。空フィールドは何も書かずにカンマを続けます。

例 a,,,bbb,1111,10,125,5555,56,71,iiii,jklm,
   
■CSV3形式

フィールドのデータ構造が文字列の場合はダブルクォーテーション(")で囲み、数値の場合はダブルクォーテーション(")等で囲まない形式です。空フィールドは何も書かずにカンマを続けます。

例 "a",,,"bbb","1111",10,125,"5555",56,71,"iiii","jklm",
   

※CSV3形式やK3形式で勘違いしてはならないのは、データ構造とデータの内容の関係です。例のようにデータの内容は、数字の場合("1111"や"5555"など)でもソフトウェア上で「テキスト型」等の文字列としての指定を行っている場合は、ダブルクォーテーションで囲むことになります。したがって、出力されたデータだけを見て、データ構造を推定することは誤りになる場合があるので、注意が必要です。

■K3形式

フィールドのデータ構造が文字列の場合はダブルクォーテーション(")で囲み、数値の場合はダブルクォーテーション(")で囲まない形式です。ただし、空フィールドはダブルクォーテーション(")で囲みます。データベース管理システム「桐」(システム管理工学研究所)で使われているフォーマットです。

例 "a","","","bbb","1111",10,125,"5555",56,71,"iiii","jklm",""
   
■CSVE形式

「\1,800」のようにフィールドのデータにカンマ(,)が使用されている場合のみ、「"\1,800"」のように引用符(")で囲む形式です。

CSVの種類とその一覧

以上を表にまとめると下記のようになります。

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の「仕様」というわけですね。




Copyright (c) 2004-2013 Mitsuo Minagawa, All rights reserved.