- ベストアンサー
VCでJetによるCSVファイルの読み込みでエラーが発生する
- VCでJetを使用してCSVファイルを読み込もうとすると、特定の文字列が正しく読み込まれない問題が発生しています。
- 問題の文字列は、"(2.0"です。
- いくつかの解決策を試しましたが、問題は解決されていません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
どうも原因は CSVファイルをJetが読み込む際のフィールドのタイプの決めるロジックにあるようです フィールドの推論を止めるようなプロパティがあるのかもしれませんが私は見つけられませんでした 補足されているデータで4番目のフィールドを縦に見ていくと (2.0 (2.0 1 5.0) 1 1 となります ココで 3,4,5,6行目が数値として認識されるみたいで、このフィールドが数値だろうと 仮定してしまうのが原因なように思います CSV冒頭に#Testとある行があるのでしたら #Test, Field1, Field2, Field3, Field4 #Test, Field1, Field2, Field3, Field4 などと ダミーのヘッダーをつけてみたほうがいいかもしれません 誤変換してしまう他のフィールドがあるなら 同じようにヘッダーを書いて見ましょう
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
別な方法として 名前空間Microsoft.VisualBasic を参照設定して FileIO::TextFieldParser を使うほうがいいのかもしれませんよ FileIO::TextFieldParser^ myReader = gcnew FileIO::TextFieldParser( "sample.csv" ); myReader->Delemiters = gcnew cli::array<String^>(1) { "," }; cli::array<String^> ^currenRow; while( !myReader->EndOfData ) { currentRow = myReader->ReadFields(); for( int n = 0; n < currentRow->Length; n++ ) { Console::Write( "{0} {1} ,", n, currentRow[n] ); } Console::WriteLine(); } myReader->Close(); delete myReader; といった具合で ・・・
お礼
ありがとう、ございました。
- redfox63
- ベストアンサー率71% (1325/1856)
CSVファイルの冒頭には ヘッダーがあるのでしょうか? ヘッダーが無いのであれば HDR=Noとしたほうがいいと思います 当方では Data1,Data2, Data3 といったダミーのヘッダーをつけてHDR=Yesの状態でテストしました また直接データという状態の場合は HDR=Noとしております ん~ そのCSVファイル自体が壊れているとか VC2008上で新たに生成したCSVでも同じ結果でしょうか? エンコード方式が Shift-JISではない といったことありませんか test1=1,(2.0,3.0)ならば 74 65 74 73 31 3D 31 2C 28 32 2E 30 2C 33 2E 30 29 t e s t 1 = 1 , ( 2 . 0 , 3 . 0 ) といった具合のバイト列になると思います Shift-JIS UTF-8等なら
補足
ご教授をありがとうございました。 ファイルの後ろの部分も影響があります。 ご助言をお願いします。 #test #test #test test1=1,(2.0,3.0),(2.0,3.0),(2.0,3.0) test1=2,(2.0,3.0),(2.0,3.0),(2.0,3.0) test_1=2,(4.0,3.0),1,(4.0,6.0),3,(4.0,3.0),4,(4.0,2.0) 1=(2.0,-4.0),(2.0,5.0),(2.0,4.0),(4.0,7.0),(4.0,7.0),(6.0,7.0),(7.0,7.0),(8.0,7.0),(4.0,6.0),(1.0,4.0),(1.0,2.0),(3.0,1.0),(4.0,1.0),(1.0,1.0) test_2=0,(3.0,1.0),1,(3.0,4.0),2,(3.0,6.0),3,(3.0,8.0),4,(3.0,2.0) test_2=0,(3.0,1.0),1 上記csvファイルでは4行目での test1=1,(2.0,3.0),(2.0,3.0),(2.0,3.0)の2番目の(2.0を読めないです。 もし、ファイル一番後ろの,1を消していくと読めるようになります。 #test #test #test test1=1,(2.0,3.0),(2.0,3.0),(2.0,3.0) test1=2,(2.0,3.0),(2.0,3.0),(2.0,3.0) test_1=2,(4.0,3.0),1,(4.0,6.0),3,(4.0,3.0),4,(4.0,2.0) 1=(2.0,-4.0),(2.0,5.0),(2.0,4.0),(4.0,7.0),(4.0,7.0),(6.0,7.0),(7.0,7.0),(8.0,7.0),(4.0,6.0),(1.0,4.0),(1.0,2.0),(3.0,1.0),(4.0,1.0),(1.0,1.0) test_2=0,(3.0,1.0),1,(3.0,4.0),2,(3.0,6.0),3,(3.0,8.0),4,(3.0,2.0) test_2=0,(3.0,1.0)
お礼
TextFieldParserの使い方を教えてください。 String^ csvfilename; Microsoft::VisualBasic::FileIO::TextFieldParser parser = gcnew Microsoft::VisualBasic::FileIO::TextFieldParser(csvfilename,System::Text::Encoding::GetEncoding("Shift_JIS"));ではエラーがあります。 error C2664: 'Microsoft::VisualBasic::FileIO::TextFieldParser::TextFieldParser(System::String ^)' : 1 番目の引数を 'Microsoft::VisualBasic::FileIO::TextFieldParser ^' から 'System::String ^' に変換できません。