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

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

VCでJetによるCSVファイルの読み込み

VCでJetによるCSVファイルを読み込む時、test_1=1,(2.0,3.0)で の”(2.0”を読み込めないです。”(”のせいかと思いますが、対処 方法を教えてください。 String^ test = gcnew String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + csvdir + ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\""); ...... csvSelect = gcnew String("SELECT * FROM [" + csvname + "]"); ....... OleDbDataReader^ reader = cmd->ExecuteReader(); //読み込みデータ test_1=1,(2.0,3.0) testdata1 = (String ^)reader[0]->ToString(); ”test_1=1”を読み込める。 testdata2 = (String ^)reader[1]->ToString(); ”(2.0”を読み込めない testdata2 は””となります。 testdata3 = (String ^)reader[2]->ToString(); ”3.0)”を読み込める >>>回答者:edp3142 Extended Properties の右辺に IMEX=1 を追加するといけるかな? IMEX=1を追加してもだめでした。 テキストなので、以下のように設定していますが、問題がないでしょうか ;Extended Properties=\"text;HDR=Yes;IMEX=1;FMT=Delimited\" >>>回答者:redfox63 当方の環境では うまく取得できるようですが ・・・ >>>VC2005/2008/2010 デバッグ環境での検証ですけど >>>reader->IsDBNull(1) は falseを返すんでしょうか? >>>testdata2 = reader->GetString(1);でも同じ結果ですか VC2008デバッグ環境で行っていました。reader->IsDBNull(1) は1となっています。 testdata2 = reader->GetString(1);で追加すると、実行するとcatch(Exceptionまで 直接にいき、読み込みがそのままで終了します。

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

  • ベストアンサー
  • 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)

関連するQ&A

  • VCでJetによるCSVファイルの読み込み

    VCでJetによるCSVファイルを読み込む時、test_1=1,(2.0,3.0)で の”(2.0”を読み込めないです。”(”のせいかと思いますが、対処 方法を教えてください。 String^ test = gcnew String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + csvdir + ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\""); ...... csvSelect = gcnew String("SELECT * FROM [" + csvname + "]"); ....... OleDbDataReader^ reader = cmd->ExecuteReader(); //読み込みデータ test_1=1,(2.0,3.0) testdata1 = (String ^)reader[0]->ToString(); ”test_1=1”を読み込める。 testdata2 = (String ^)reader[1]->ToString(); ”(2.0”を読み込めない testdata2 は””となります。 testdata3 = (String ^)reader[2]->ToString(); ”3.0)”を読み込める

  • VB.netでJet.OLEDBを使いCSVを読み

    VB.netでOleDbConnectionを使ってCSVを読み込むと便利ですが、属性判定を勝手にされたくありません。 どうすればコントロールできますか? 個別に属性を決めるか、もしくは全部文字列として受け取りたいです。 何もしなければ、項目の属性が自動で決まりますが、その属性判断が甘く、属性に合わない値が消えます。 例えば、 日付項目っぽい値が入っている項目にたまに文字列がるとすると、 その項目が日付項目になって、日付項目に合わないデータは空白になってしまいます。 CSVの読み込みは一旦すべて文字列にして受け取り、その後の事はアプリでコントロールしたいです。 どうすればできますか? Dim OleDbConnection1 As New OleDb.OleDbConnection Dim OleDbCommand1 As New OleDb.OleDbCommand Dim OleDbDataAdapter1 As New OleDb.OleDbDataAdapter Dim FileInfo1 As New FileInfo(CSVファイルの名前をフルパスで) OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & FileInfo1.DirectoryName & "\;" _ & "Extended Properties=" & ControlChars.Quote & "Text;HDR=No;FMT=Delimited" & ControlChars.Quote OleDbConnection1.Open() OleDbCommand1.CommandText = "SELECT * FROM [" & FileInfo1.Name & "]" OleDbCommand1.Connection = OleDbConnection1 OleDbDataAdapter1.SelectCommand = OleDbCommand1 OleDbDataAdapter1.Fill(DataTable1) OleDbDataAdapter1.Dispose() OleDbCommand1.Dispose() OleDbConnection1.Dispose()

  • VC++でファイルへの書き込みについて

    VC++にて、ファイルへの書き込みを行っているのですが、どうもうまくいきません。 Form.h //ファイル->開く private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { //開くダイアログ表示 OpenFileDialog^ dlg = gcnew OpenFileDialog(); dlg -> Filter = "CSV形式(*.csv)|*.csv|すべてのファイル(*.*)|*.*"; if (dlg -> ShowDialog() != System::Windows::Forms::DialogResult::OK){ return; } //CSV形式でファイルを読み込み LoadCsvFile( dlg -> FileName ); } //ファイルの読み込み private: bool LoadCsvFile( String^ path ){ //ファイルをオープン StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); //ファイル読み込み String^ data; data = reader -> ReadLine(); st = from_cli(data); //dataをグローバル変数std::string = stに変換 reader -> Close(); return true; } //System::String -> std::string変換用 std::string from_cli(String^ input, Encoding^ encoding) { array<Byte>^ result = Encoding::Convert(Encoding::Unicode, encoding, Encoding::Unicode->GetBytes(input)); if ( result->Length != 0 ) { pin_ptr<unsigned char> pin = &result[0]; return std::string(reinterpret_cast<char*>(pin), result->Length); } return std::string(); } //ボタンクリックイベント private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { std::ofstream ofs; ofs.open( "test.txt" ); ofs << st << std::endl; ……(1) ofs.close(); } csvファイルを読み込み後、ボタンクリックイベントを行ってもtext.txtの内容が書き変わりません。 (1)の部分をofs << "test" << std::endl;に変更したり、 button1_Click内で変数st2を宣言し、 ofs << st2 << std::endl;に変更すると、問題無くファイルへの書き出しが行えます。 文字コード等が関わっているのでしょうか? 御助言の程、よろしくお願いします。

  • VB2010でCSV取込

    VB2010とAccessを使用しています。 あるCSVファイルからACCESSへデータ取り込みをしようとして CSVをデータテーブルに代入するコードを考えているのですが 下記のコードでは『FROM句』のエラーのようでうまく作動しません? ご教授お願いします。 Private Sub ToolMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolMenu.Click Dim OFD As New OpenFileDialog OFD.FileName = "" OFD.InitialDirectory = "\\10.20.100.35\data\LOG\" OFD.Filter = "CSVファイル(*.csv)|*.csv|すべてファイル(*.*)|*.*" OFD.FilterIndex = 1 OFD.Title = "取り込むCSVファイルを選択してください" OFD.RestoreDirectory = True OFD.CheckFileExists = True OFD.CheckPathExists = True If OFD.ShowDialog() = DialogResult.OK Then Try Dim DT As New DataTable '===============CSVからクエリ=============== Using OleCn As New System.Data.OleDb.OleDbConnection Dim CSVFileName As String = System.IO.Path.Combine(OFD.InitialDirectory, "aaa.csv") OleCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & OFD.InitialDirectory & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Dim SQL As String = "" SQL = "SELECT * FROM " + CSVFileName Using DA As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter(SQL, OleCn) DT.Clear() DA.Fill(DT) End Using End Using Catch ex As Exception MessageBox.Show(ex.ToString, "例外発生") Exit Sub End Try End If End Sub

  • VB2005 CSVファイルをテーブルへインポート

    こんばんは。 VB2005にてCSVファイルをテーブルへ、インポートする処理を作成しています。ネットで調べたコードを試しています。デバックは通るのですが、処理結果がテーブルへ出力されません。 (TESTdataset内にTable1を作成しています。) 何か解決案がありましたらご教示をお願いいたします。 また、 ※1の'DataGridView1の文なのですが、コメントを外すと 宣言がされていない旨のメッセージが出てきてしまいます。 もし此方も解決案が御座いましたらご教示をお願いいたします。 -------------------------------------------------------------- 以下コードです -------------------------------------------------------------- Imports System.Data Imports System.Data.OleDb Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Const csvPath As String = "c:\DB\" Const csvFile As String = "TEST.csv" Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & csvPath _ & ";" & "Extended Properties='text;FMT=Delimited'" Dim objConn As New OleDbConnection(sConnectionString) objConn.Open() Dim objCmdSelect As New OleDbCommand("SELECT * FROM " & csvFile, objConn) Dim objAdapter1 As New OleDbDataAdapter() objAdapter1.SelectCommand = objCmdSelect Dim objDataset1 As New DataSet() Dim objTable As DataTable Dim Col As DataColumn objDataset1 = New DataSet("TEST") objTable = New DataTable("Table1") Col = New DataColumn("No") Col.DataType = Type.GetType("System.Int16") objTable.Columns.Add(Col) Col = New DataColumn("Name") Col.DataType = Type.GetType("System.String") objTable.Columns.Add(Col) Col = New DataColumn("出身") Col.DataType = Type.GetType("System.String") objTable.Columns.Add(Col) objDataset1.Tables.Add(objTable) objAdapter1.Fill(objDataset1.Tables(0)) ※1'DataGridView1.DataSource = objDataset1.Tables(0).DefaultView objConn.Close() End Sub End Class --------------------------------------------------------- ※お礼が遅れる場合がありますが、必ずしますので、その時は少々お待ちください。

  • 【VC++2005(CLR)】ファイルの更新日時を取得するには?

    いつもお世話になっております。 VC++初心者です。 ファイルの更新日時を取得するには、どうしたら宜しいか 教えて頂けませんでしょうか。 現在このようなソースを書きましたが、 aaa.txtの実際の最終更新日とこのソースで取得した更新日が 全く異なります。 (このソースで取得した日付は、このプログラムを実行した 時間(それに近い時間)を出力しています。) String^ souceFile_rep = "aaa.txt"; //レポートファイルのタイムスタンプ取得 System::IO::FileInfo^ pFileProps = gcnew System::IO::FileInfo(sourceFile); DateTime dtSourceFileLastWrite = pFileProps->LastAccessTime; String^ strSourceFileLastWrite = dtSourceFileLastWrite.ToString(); delete pFileProps; 具体的にどこが、良くなかったのかご指摘頂けませんでしょうか。

  • wshでcsvファイルのソートを行いたい

    wshのプログラムで困っているため教えてください。 wshでcsv(カンマ区切り)のファイルのソートを行い、Escel形式で保存するプログラムを書いています。 調べてみたところ、wshではソート関数がないようで、 adodbのsort関数を使用して対処しようとしていますが、どうもうまくいきません。 (※adodbの必要はないのですが、ExcelVBAのsortのコードを書こうとするとエラーになってしまったので、adodbにしています。) <仕様> csvファイルのソートのキーになるのは、「判定区分」の値で昇順に行いたいです。 csvファイルの一行目は、カラム名としてソート対象にはなりません。 読み込んだcsvファイルをexcel形式に保存したいです。 ■csvファイルの形式は、以下のような形です。 性別,年代,判定区分,生年月日,日付 女性,10,0,2010/01/10,2013/7/7 23:57 男性,50,2,2000/03/30,2013/7/7 13:7 女性,10,0,1990/01/20,2013/7/7 15:22 女性,20,1,2001/12/10,2013/7/7 8:10 *----------------------------------- <ソース> Set con = CreateObject("ADODB.Connection") With con .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path & ";" _ & "Extended Properties='text;HDR=Yes;FMT=Delimited'" .Open End With Set rec = CreateObject("ADODB.Recordset") rec.Open "select * from " & csvfile & " order by 判定区分", con *----------------------------------- うまくいかないため ↓でも書いています。 *----------------------------------- Const adDate = 7 Const adVarChar = 200 Dim ans Set objADO = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set re = CreateObject("VBScript.RegExp") rs.Fields.Append "性別", adVarChar, 255 rs.Fields.Append "年代", adVarChar, 255 rs.Fields.Append "判定区分", adVarChar, 255 rs.Fields.Append "生年月日", adDate rs.Fields.Append "日付", adDate rs.Open ans = "" rs.Sort ="判定区分 ASC" rs.MoveFirst Do While Not rs.EOF ans = ans & rs.Fields(0).Value & vbCrLf rs.MoveNext Loop MsgBox ans エラーになってしまいます。 ソート処理だけですでににっちもさっちもいかないため、教えていただきたいです。 どうぞ宜しくお願いいたします。

  • 作成したレコードセットのCSV出力の方法

    test.csv とtest2.csvから作成したレコードセットをtest3.csvに出力したいのですが、 ”指定した式は、いずれかの引数とデータ型が対応していません。” とエラーが帰ってきます。 色々試したのですがうまくいきません、 作成したレコードセットをCSVファイルにエクスポートする方法を教えてください。 Private Sub コマンド6_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = New ADODB.Connection CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\;" & _ "Extended Properties='Text;HDR=YES'" Set RS = CN.Execute("SELECT * FROM test.csv a LEFT JOIN test2.csv b ON a.tel = b.tel") DoCmd.TransferText acExportDelim, , RS, "C:\test3.csv", True, "" Set RS = Nothing Set CN = Nothing End Sub

  • VB2010でのSQL日付フォーマット表記変更

    VB2010Expressを使用しています。 VBにてあるCSVファイルの内容をmdbファイルに移行するプログラムを作成しています DateTimePickerの日付を条件にしているんですがCSVの日付表記が『yyyymmdd』になっていて下記のコードでは『 (Me.Date日付.Text).ToString("yyyyMMdd")』の部分で『'String' から 'System.IFormatProvider' への変換時にランタイム エラーが発生する可能性があります。』とエラーが出ます。 自宅PCでは『(Me.Date日付.Text).ToString("yyyyMMdd")』を『DateAdd("d", 0, Me.Date健診日.Text).ToString("yyyyMMdd")』にしたらエラーなく動いたのですが、今日職場のPCで検証したら『型が合いません的なエラーが出てしまいます。(日付部分でのエラーみたいなのですが職場でのエラーをメモし忘れました、スイマセン) 日付のフォーマット変更そしてPCの違いによるエラーの発生原因についてご教授お願いします。 Try Dim DT As New DataTable '===============CSVからクエリ=============== Using OleCn As New System.Data.OleDb.OleDbConnection OleCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderPath & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Dim SQL As String = "" SQL = "SELECT * FROM " + CSVFileName + " WHERE 日付 BETWEEN " + DateAdd("d", -1, Me.Date日付.Text).ToString("yyyyMMdd") + " AND " + (Me.Date日付.Text).ToString("yyyyMMdd") Using DA As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter(SQL, OleCn) DT.Clear() DA.Fill(DT) End Using End Using '===============CSV-importへの登録=============== コード省略 Catch ex As Exception MessageBox.Show(ex.ToString, "例外発生") Exit Sub End Try

  • サーバー上(外部)のテキストの読み込み

    以下のようなtest.txtから二次元配列を読み込むプログラムを 今度はクライアントがapplet上からサーバーのappletプログラムがあるフォルダにあるtest.txtからデータを読み込むようにしたいのですが どうしてもセキュリティ上のエラーが出てしまいます。 画像などはgetImageでうまくいくのですが・・・ BufferedReader reader = null; String strArray[][] = new String[5][2]; String fileName = "test.txt"; int i = 0; int j = 0; try { reader = new BufferedReader ( new FileReader(fileName) ); String line; while ( (line = reader.readLine() ) != null ) { StringTokenizer st = new StringTokenizer (line ); while ( st.hasMoreTokens() ) { strArray[i][j] = st.nextToken(); j++; } j = 0;// 横のindexをリセット i++;// 縦のindexを次に } } catch ( Exception e ) { System.out.println ( e.toString() ); } ---------test.txt(例) 200 200 30 60 301 33 11 66 100 390 自分でも調べていくつもりですが期限があるためもしご存知の方がいましたら是非ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java