none
特定のPCで作成したCSVデータが読み込んだ時にdatatableにテキストが格納されない RRS feed

  • 質問

  • お世話になります。

    症状)特定のPCで作成したCSVデータのテキストデータがdatatableに格納するとDBnullになってしまいます。他のPCで作成したCSVデータは問題なくtextが格納されています。

    CSVを生成するアプリ)vb2015で作成、アプリの中身としては何台かの変換器から送られてくるデータをCSV形式のデータで保存するアプリです。

    CSVを読み込むアプリ)vb2015で作成、Microsoft.Jet.OLEDBを使用してdatatableにCSVデータを格納させています。

    CSVデータの中身は最初の10行ぐらいにテキストデータ(日付、条件等)が格納されていて、その後の行にずーっと変換機から送られてくるデータが入っています。

    最近購入したタブレットPCで上記のアプリでCSVを作成すると他のPCでもdatatableにテキストが格納されません。他のPCで作成したCSVデータは問題なく動きます。ただ、問題を起こしているPCも起こしていないPCもwindows10です。問題が起きていいるCSVファイルも、大丈夫なCSVファイルもエクセルやノートパッドでデータを確認してもtextデータは格納されていて一見問題なさそうに見えます。

    CSVデータを貼り付けれて問題なければ貼り付けるのですが…。

    2018年6月4日 2:23

回答

  • 接続文字列に ;IMEX=1; を加えてみた場合、改善されないでしょうか。
    それで駄目な場合は、レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Text のキーを開き、MaxScanRows 値を DWORD 0x0 に変更するか、ImportMixedTypes 値を文字列 "Text" にしておいてください。

    もしくは、Scema.ini を用意するとか。

    ADO.NETでのCSVファイルインポート

    • 回答としてマーク 9638masa 2018年6月6日 6:38
    2018年6月4日 4:01
  • > Microsoft.Jet.OLEDBを使用してdatatableにCSVデータを格納させています。

    「CSVの読込部分」が JET だった時は問題なかったということであれば、対症療法的かもしれませんが、JET はOS 同梱ですので(タブレット PC とかは分かりませんが、Win7 とか Win10 ならば)、JET を使えばよいのではないですか?

    JET は 32-bit 版しかないのですか、アプリを x86 でコンパイルすれば、64-bit OS 上でも WOW64 で動きます。

     
    • 回答としてマーク 9638masa 2018年6月6日 6:38
    2018年6月5日 6:06
  • Jet であれ ACE であれ、取り込み時には数値型や日付型を使わず、全列がテキスト形式(CharまたはLongChar)の schema.ini を用意しておき、ファイル名も固定にして取り込むような運用の方が、トラブルが少ないかもしれません。(ただし Jet は既に非推奨とされています)

    レジストリでACEを触る場合をご教授下さい。

    Microsoft.ACE.OLEDB.12.0 をお使いであれば、下記のエントリー(の下の、Text キーにある TypeGuessRows 値)を設定してみてください。

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines

    ただしこれはシステム全体に影響を与えることになります。アプリ固有のプロファイルにしたい場合にしたい場合には、"Access Connectivity Engine" 以下の内容を、HKLM 以下の任意のエントリー(たとえば、HKLM\SOFTWARE\MyCorporation\MyApplication\1.0\ など)に複製しておき、そこにカスタム設定(TypeGuessRows の変更など)を加えて利用することもができます。カスタムエントリーから設定を読み込ませる場合には、接続文字列に ";Jet OLEDB:Registry Path=SOFTWARE\MyCorporation\MyApplication\1.0;" といった指定を加えます。

    ちなみに最近の Microsoft Access でも、この Jet OLEDB:Registry Path が使われるようになっており、既定で下記のエントリーが利用されるようです。

    [Access 2016, C2R, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines
    [Access 2016, MSI, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MICROSOFT\Office\16.0\Access Connectivity Engine\Engines
    [Access 2016, C2R, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines
    [Access 2016, MSI, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Office\16.0\Access Connectivity Engine\Engines
    [Access 2013, C2R, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2013, MSI, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2013, C2R, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2013, MSI, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2010, MSI, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines
    [Access 2010, MSI, 32bit/64bit]
    HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines

    • C2R => クイック実行形式の Office を導入している場合
    • MSI => Windows インストーラー形式の Office を導入している場合
    • WOW64 => 64bit版の Windows 上で 32bit 版ドライバーを使う場合
    • 32bit => 32bit版の Windows 上で 32bit 版ドライバーを使う場合
    • 64bit => 64bit版の Windows 上で 64bit 版ドライバーを使う場合

    schema.iniでも作業しました。ばっちり読むことはできるのですが、一つのcsv ファイルに対して、1つ生成しなくてはいけないものなのですよね?

    いいえ。一つの schema.ini の中に、複数の csv 設定を記録することができます。schema.ini は、対象の csv フォルダーと同じフォルダーになければなりません。schema.ini で設定した内容は、レジストリで指定された既定値設定よりも優先されます。

    毎回2,3個CSVファイルを作って、読み込ませるので何個もschema.iniを作るのは難しいなと思いました。

    列定義が固定なら、一度作った schema.ini をそのまま置いておくだけなので、手間は変わらないはずです。csv を動的に生成しているのなら、schema.ini も動的に生成すれば済みます。

    ユーザーに作成を依頼するのであれば、ODBC ドライバーに作成画面が用意されています。

    1. ODBC データ ソース アドミニストレーター(odbcad32.exe)を開く。
    2. いずれかの DSN タブで[追加]を押して、インストールされている Text ドライバーを選択する。
    3. 「☑現在のフォルダーを使用する(U)」のチェックを解除して、[フォルダーの選択(S)]でCSVの場所を指定する。
    4. [オプション(O)>>]を押して、[書式の定義(F)...]から、該当する CSV ファイルの列定義を個別に調整する。


    2018年6月6日 2:13

すべての返信

  • 接続文字列に ;IMEX=1; を加えてみた場合、改善されないでしょうか。
    それで駄目な場合は、レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Text のキーを開き、MaxScanRows 値を DWORD 0x0 に変更するか、ImportMixedTypes 値を文字列 "Text" にしておいてください。

    もしくは、Scema.ini を用意するとか。

    ADO.NETでのCSVファイルインポート

    • 回答としてマーク 9638masa 2018年6月6日 6:38
    2018年6月4日 4:01
  • 何かしらCSVに違いがあるはずなので、まずはそれを見つけることです。
    読み取るアプリが同じであれば、CSVに差異があると考えるのが普通です。そのCSVのどこに問題があるのか分からない時は、行数を減らしていき、問題個所を特定するなどできるでしょう。
    また、読み取るアプリがデバッグできるのであれば、ブレークポイントで止めながら、どのような値がデータテーブルに格納されるかを追っていけば良いでしょう。
    いずれにしてもcsv比較等を含めたデバッグをし、根本的な問題を見つける必要があります。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年6月4日 7:31
    モデレータ
  • 魔界の仮面弁士さん、アドバイスありがとうございます。

    レジストリのjetの項目をいじっても読んだり読まなかったりするので変だな~と思って、よーく見ましたら。ACEでした。

    ほかのPCでも同じような症状が出るようになりまして。。。。

    申し訳ありませんが、レジストリでACEを触る場合をご教授下さい。


    CSVの読込部分

    Using cn As New System.Data.OleDb.OleDbConnection
                cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FolderPath &
                              ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited"""
                Using da As System.Data.OleDb.OleDbDataAdapter =
                           New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & csvFileName, cn)
                    da.Fill(ds, "Table1")
                    Chart1.DataSource = ds                       'Chart に表示するデータソースを設定
                    columns = ds.Tables(0).Columns.Count - 1      'データの系列数を取得
                    rows = ds.Tables(0).Rows.Count

                End Using
            End Using

    schema.iniでも作業しました。ばっちり読むことはできるのですが、一つのcsv ファイルに対して、1つ生成しなくてはいけないものなのですよね?

    毎回2,3個CSVファイルを作って、読み込ませるので何個もschema.iniを作るのは難しいなと思いました。自分が作業するなら、いいのですが他人に毎回この作業を強いるのは無理と思いました。

    CSVデータの中身の構成は毎回ほぼ同じなので、プログラムの最初にファイルを読み込む形式を設定する部分を作ればいいのではと思いました。それってレジストリの中でImportMixedTypes 値を文字列 "Text"ってやる事とおなじですか? 


    2018年6月5日 5:50
  • > Microsoft.Jet.OLEDBを使用してdatatableにCSVデータを格納させています。

    「CSVの読込部分」が JET だった時は問題なかったということであれば、対症療法的かもしれませんが、JET はOS 同梱ですので(タブレット PC とかは分かりませんが、Win7 とか Win10 ならば)、JET を使えばよいのではないですか?

    JET は 32-bit 版しかないのですか、アプリを x86 でコンパイルすれば、64-bit OS 上でも WOW64 で動きます。

     
    • 回答としてマーク 9638masa 2018年6月6日 6:38
    2018年6月5日 6:06
  • SurferOnWwwさん、アドバイスありがとうございます。

    確かにACEじゃなきゃいけないなんてことはこれっぽちもなかったです。

    ただ、最小限の修正で済むのがACEのレジストリを修正する案でしたが、自分で探しましたが、探す方が時間がかかりそうなので、JETに変更しました。少し修正することになりましたが、問題なく動きそうです。

    しかし、急にCSVfileのテキストデータをACEを利用してデータテーブル?セット?の読み込ませられなくなった原因はなんだったのかが分かりません。あるとしたらwindows10のアップデートなのか?

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

    2018年6月5日 13:34
  • 9638masa さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    フォーラム オペレーターから一点お願いをさせてください。

    皆様からいただいた情報はお役に立ちましたでしょうか。
    もし参考となる情報 (投稿) がありましたら、
    その投稿に [回答としてマーク] をご設定ください。

    同じ問題であとから参照した方がすぐに情報を確認できるように
    なりますのでご協力の程、どうぞよろしくお願いいたします。

    フォーラム利用時の注意点のお知らせです。
    フォーラムでご質問頂くにあたっての注意点
    フォーラムのご利用方法(質問の投稿)について
    フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年6月6日 0:28
    モデレータ
  • Jet であれ ACE であれ、取り込み時には数値型や日付型を使わず、全列がテキスト形式(CharまたはLongChar)の schema.ini を用意しておき、ファイル名も固定にして取り込むような運用の方が、トラブルが少ないかもしれません。(ただし Jet は既に非推奨とされています)

    レジストリでACEを触る場合をご教授下さい。

    Microsoft.ACE.OLEDB.12.0 をお使いであれば、下記のエントリー(の下の、Text キーにある TypeGuessRows 値)を設定してみてください。

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines

    ただしこれはシステム全体に影響を与えることになります。アプリ固有のプロファイルにしたい場合にしたい場合には、"Access Connectivity Engine" 以下の内容を、HKLM 以下の任意のエントリー(たとえば、HKLM\SOFTWARE\MyCorporation\MyApplication\1.0\ など)に複製しておき、そこにカスタム設定(TypeGuessRows の変更など)を加えて利用することもができます。カスタムエントリーから設定を読み込ませる場合には、接続文字列に ";Jet OLEDB:Registry Path=SOFTWARE\MyCorporation\MyApplication\1.0;" といった指定を加えます。

    ちなみに最近の Microsoft Access でも、この Jet OLEDB:Registry Path が使われるようになっており、既定で下記のエントリーが利用されるようです。

    [Access 2016, C2R, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines
    [Access 2016, MSI, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MICROSOFT\Office\16.0\Access Connectivity Engine\Engines
    [Access 2016, C2R, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines
    [Access 2016, MSI, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Office\16.0\Access Connectivity Engine\Engines
    [Access 2013, C2R, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2013, MSI, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2013, C2R, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2013, MSI, 32bit/64bit]
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines
    [Access 2010, MSI, WOW64]
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines
    [Access 2010, MSI, 32bit/64bit]
    HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines

    • C2R => クイック実行形式の Office を導入している場合
    • MSI => Windows インストーラー形式の Office を導入している場合
    • WOW64 => 64bit版の Windows 上で 32bit 版ドライバーを使う場合
    • 32bit => 32bit版の Windows 上で 32bit 版ドライバーを使う場合
    • 64bit => 64bit版の Windows 上で 64bit 版ドライバーを使う場合

    schema.iniでも作業しました。ばっちり読むことはできるのですが、一つのcsv ファイルに対して、1つ生成しなくてはいけないものなのですよね?

    いいえ。一つの schema.ini の中に、複数の csv 設定を記録することができます。schema.ini は、対象の csv フォルダーと同じフォルダーになければなりません。schema.ini で設定した内容は、レジストリで指定された既定値設定よりも優先されます。

    毎回2,3個CSVファイルを作って、読み込ませるので何個もschema.iniを作るのは難しいなと思いました。

    列定義が固定なら、一度作った schema.ini をそのまま置いておくだけなので、手間は変わらないはずです。csv を動的に生成しているのなら、schema.ini も動的に生成すれば済みます。

    ユーザーに作成を依頼するのであれば、ODBC ドライバーに作成画面が用意されています。

    1. ODBC データ ソース アドミニストレーター(odbcad32.exe)を開く。
    2. いずれかの DSN タブで[追加]を押して、インストールされている Text ドライバーを選択する。
    3. 「☑現在のフォルダーを使用する(U)」のチェックを解除して、[フォルダーの選択(S)]でCSVの場所を指定する。
    4. [オプション(O)>>]を押して、[書式の定義(F)...]から、該当する CSV ファイルの列定義を個別に調整する。


    2018年6月6日 2:13