- PR -

CSVファイルの読込処理について

投稿者投稿内容
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-01-10 16:59
それじゃあ仕方ない。
左端から1文字ずつ読み込んで、
これは文字列をくくる二重引用符か文字列としての二重引用符か、
これはデータを区切るカンマか文字列としてのカンマか、
カンマの次に数字が表れたが、これは新しいデータの始まりかどうか、
いちいち判定するしかないですね。
頑張ってデータを解析して、アルゴリズムを組んでください。
私よりも親切な方もたくさんいるでしょう。

<追記>
ところで、数字は3桁ごとにカンマで区切られたりしてませんよね。

[ メッセージ編集済み 編集者: Edosson 編集日時 2006-01-10 17:00 ]
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-10 17:08
引用:

※「このカンマは区切り文字のカンマで、このカンマは項目のカンマだよ」と
 判定する方法が思いつきません…。


データの文字そのものに印が付いているわけではないので「文字」からはわかりません。
しかし、その区別をしてくれるのが引用文字です。
じゃんぬさんの言われるとおり、その内側にあるのがデータで外側にあるのが区切り文字です。

判定ロジック的には先頭から1文字ずつループが基本でしょう。
で、その文字が何なのかという判定が内側に入るわけですが
前述のとおり引用文字が区切り文字かどうかの判断材料ですから、引用文字の判定が優先されます。
引用文字が出てくればフラグを使って、引用開始/引用終了とともに文字の判定をすればよいでしょう。
コード:
'mobjDataArrayは項目単位の文字列コレクション
        strValue = ""
        InQuote = False
        For i As Integer = 1 To Text.Length
            strChar = Text.Substring(i - 1, 1)
            Select Case True
                Case i = Text.Length And Not InQuote
                    If strChar = strSeparator Then
                        mobjDataArray.Add(strValue)
                        mobjDataArray.Add("")
                    Else
                        strValue &= strChar
                        mobjDataArray.Add(strValue)
                    End If
                Case i = Text.Length And InQuote
                    If strChar = strQuotation Then
                        mobjDataArray.Add(strValue)
                    Else
                        strValue &= strChar
                        mobjDataArray.Add(strValue)
                    End If
                Case strChar = strSeparator And Not InQuote
                    mobjDataArray.Add(strValue)
                    strValue = ""
                Case strChar = strQuotation
                    InQuote = Not InQuote
                Case Else
                    strValue &= strChar
            End Select
        Next


#あってるだろうか。。。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-10 17:15
引用:

CSVの項目そのものに二重引用符が含まれていることが
有り得ることを想定しております。


であれば、エスケープ文字を規定するか、データとしてはならない引用符を規定するしかないでしょう。
いずれにしても前述のように単に判定の優先度の問題ですので、簡単に応用が利くはずです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 17:38
ご参考までに CSV クラスを。

  わんくまライブラリ Wankuma.IO.CSV クラス

二重引用符については、私が先に回答をしたように、エスケープできるようにしましょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
元イノキイズム
常連さん
会議室デビュー日: 2005/12/05
投稿数: 24
投稿日時: 2006-01-10 17:41
イノキイズムです。
Edosson様、まどか様、じゃんぬねっと様ご回答ありがとうございました。

引用:

Edossonさんの書き込み (2006-01-10 16:59) より:
それじゃあ仕方ない。
左端から1文字ずつ読み込んで、
これは文字列をくくる二重引用符か文字列としての二重引用符か、
これはデータを区切るカンマか文字列としてのカンマか、
カンマの次に数字が表れたが、これは新しいデータの始まりかどうか、
いちいち判定するしかないですね。
頑張ってデータを解析して、アルゴリズムを組んでください。
私よりも親切な方もたくさんいるでしょう。

<追記>
ところで、数字は3桁ごとにカンマで区切られたりしてませんよね。



数字は3桁ごとにカンマで区切られて渡ってくる可能性が高いです。

引用:

まどかさんの書き込み (2006-01-10 17:15) より:
であれば、エスケープ文字を規定するか、データとしてはならない引用符を規定するしかないでしょう。
いずれにしても前述のように単に判定の優先度の問題ですので、簡単に応用が利くはずです。


「データとしてはならない引用符を規定する」方法で
設計者ともう少し話し合おうと思います。


ご回答頂きました皆さまありがとうございました。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-01-10 17:55
引用:

イノキイズムさんの書き込み (2006-01-10 17:41) より:

数字は3桁ごとにカンマで区切られて渡ってくる可能性が高いです。


そんな、数値がカンマを含み、かつ二重引用符で囲まれていないのでは、
CSVから元のデータを復元するのは不可能になっちゃいます。
引用:

設計者ともう少し話し合おうと思います。


・「データを囲む引用符」とデータの中に出現する引用符を、それぞれ別にするか、
 またはエスケープ文字を規定する。
・文字列だろうが数値だろうが、すべて「データを囲む引用符」で囲む
これだけは押さえておいた方がいいかと。
ホッピー
会議室デビュー日: 2006/01/04
投稿数: 4
投稿日時: 2006-01-11 09:33
値のない、空文字のフィールドもありそうなので、
その辺も考慮してエスケープ文字を規定する必要が
あるかと思います。


元イノキイズム
常連さん
会議室デビュー日: 2005/12/05
投稿数: 24
投稿日時: 2006-01-11 09:47
イノキイズムです。
Edosson様、ホッピー様ご回答ありがとうございます。

引用:

Edossonさんの書き込み (2006-01-10 17:55) より:
・「データを囲む引用符」とデータの中に出現する引用符を、それぞれ別にするか、
 またはエスケープ文字を規定する。
・文字列だろうが数値だろうが、すべて「データを囲む引用符」で囲む
これだけは押さえておいた方がいいかと。


引用:

ホッピーさんの書き込み (2006-01-11 09:33) より:
値のない、空文字のフィールドもありそうなので、
その辺も考慮してエスケープ文字を規定する必要が
あるかと思います。


ご忠告頂きました内容を押さえ設計者と話し、実装して行こうと思います。

スキルアップ/キャリアアップ(JOB@IT)