- 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) より:
値のない、空文字のフィールドもありそうなので、
その辺も考慮してエスケープ文字を規定する必要が
あるかと思います。
|
ご忠告頂きました内容を押さえ設計者と話し、実装して行こうと思います。
|