• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VCでJetによるCSVファイルの読み込み)

VCでJetによるCSVファイルの読み込みでエラーが発生する

このQ&Aのポイント
  • VCでJetを使用してCSVファイルを読み込もうとすると、特定の文字列が正しく読み込まれない問題が発生しています。
  • 問題の文字列は、"(2.0"です。
  • いくつかの解決策を試しましたが、問題は解決されていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

どうも原因は 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 などと ダミーのヘッダーをつけてみたほうがいいかもしれません 誤変換してしまう他のフィールドがあるなら 同じようにヘッダーを書いて見ましょう

yokodragon22
質問者

お礼

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 ^' に変換できません。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

別な方法として 名前空間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; といった具合で ・・・

yokodragon22
質問者

お礼

ありがとう、ございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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等なら

yokodragon22
質問者

補足

ご教授をありがとうございました。 ファイルの後ろの部分も影響があります。 ご助言をお願いします。 #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)