DOBON.NETプログラミング道掲示板
(現在 過去ログ3 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34114 / inTopicNo.1)  数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
  
□投稿者/ Iraquser 一般人(1回)-(2019/02/05(Tue) 11:16:21)
  • アイコン環境/言語:[Win10 c#] 
    分類:[.NET] 

    いつもお世話になっています。「CSV形式のファイルをDataTableや配列等として
    取得する」(https://dobon.net/vb/dotnet/file/readcsvfile.html)を参考に、
    CSVから情報を読み取るアプリを作成中です。
    入力するCSVデータの中に数字のみで構成されたフィールドを含んでおり、先
    頭(最上位桁)が「0」の場合にエラーが発生して困っています。フィールドを
    構成する文字が数字だけのため自動的に整数型と判断されるようです。
    数字だけで構成されたフィールドも文字列として認識させるためには、それなり
    のコードを自分達で書くしかないのでしょうか。該当フィールドをダブルクォー
    テーションで囲むとか、schema.iniを同じディレクトリに作成するとかすれば解
    決する事は判っているのですが、CSVを吐くセクションが顧客資産の時代物(
    ソースが行方不明)で変更は事実上不可能、それなりのコードを自分達(?)で
    書く事は大人の事情でハードルが高い事を御理解の上で御指導お願いします。
    
    >        private void Form1_Shown(object sender, EventArgs e) {
    >            ReadCSV();
    >        }
    >        private void ReadCSV() {
    >            //CSVファイルのあるフォルダ
    >            string csvDir = System.Environment.CurrentDirectory;
    >            //CSVファイルの名前
    >            string csvFileName = "test.csv";
    >            //接続文字列
    >            string conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    >                + csvDir + ";Extended Properties=\"text;HDR=No;FMT=Delimited\"";
    >            System.Data.OleDb.OleDbConnection con =
    >                new System.Data.OleDb.OleDbConnection(conString);
    >            string commText = "SELECT * FROM [" + csvFileName + "]";
    >            System.Data.OleDb.OleDbDataAdapter da =
    >                new System.Data.OleDb.OleDbDataAdapter(commText, con);
    >            //DataTableに格納する
    >            DataTable dt = new DataTable();
    >            da.Fill(dt);
    >        }
    
    入力データ
    >001,01234
    >012,ABCDE
    >123,あいうえお
    
    
    

286×193 => 250×168
イメージ
1549332981.png
/2KB
引用返信 削除キー/
■34115 / inTopicNo.2)  Re[1]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ Hongliang 大御所(551回)-(2019/02/05(Tue) 11:25:49)
  • アイコンリンク先にはJET以外にも様々な方法が提示されているようですが。

    > schema.iniを同じディレクトリに作成するとかすれば解決する事は判っているのですが、CSVを吐くセクションが顧客資産の時代物(ソースが行方不明)で変更は事実上不可能
    iniファイルを用意することと「セクションが変更不可能」というのの関連がよく分かりませんでした。(セクションというのは何を指すのか…?)
引用返信 削除キー/
■34116 / inTopicNo.3)  Re[1]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ 魔界の仮面弁士 大御所(1193回)-(2019/02/05(Tue) 12:14:24)
  • アイコン2019/02/05(Tue) 12:16:25 編集(投稿者)

    No34114に返信(Iraquserさんの記事)
    > > //接続文字列
    > > string conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    > > + csvDir + ";Extended Properties=\"text;HDR=No;FMT=Delimited\"";

    データ中に「改行」「"」「,」などの特殊文字を含むような CSV で無いのなら、
    File.ReadAllLines を Split するような LINQ 式で処理した方が手っ取り早いかも。



    もし、Jet/ACE を使って取り込む方法を採用するのであれば、
    取りうる選択肢としては下記の 3 通り。


    案1)CSV 取込前に schema.ini を動的に配置する。
     schema.ini では、全列に対してテキスト形式(CharまたはLongChar)を
     割り当てておくこと。


    案2)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text
     のレジストリキーを開き、MaxScanRows 値を DWORD 0x0 に変更するか、
     ImportMixedTypes 値を文字列 "Text" にしてから実行する。
    ※システム全体に影響を与えます。


    案3)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0
     の下にあるレジストリの内容を、自身のアプリ専用エントリー
     (例:HKEY_LOCAL_MACHINE\SOFTWARE\MyGroup\MyApp\1.0\)
     に配置し、そこの MaxScanRows / ImportMixedTypes を指定しておいた上で
     接続文字列に対して
      ";Jet OLEDB:Registry Path=SOFTWARE\MyGroup\MyApp\1.0;"
     を追加しておく。
    ※自身のアプリケーションのみに影響を与えます。


    なお 64bit OS をお使いの場合は、案2/案3のレジストリキーが
    SOFTWARE ではなく SOFTWARE\Wow6432Node 配下のエントリーとなります。
引用返信 削除キー/
■34117 / inTopicNo.4)  Re[1]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ まりもん 一般人(5回)-(2019/02/05(Tue) 12:24:23)
  • アイコン出力されるCSVのフォーマットは決まっているのでしょうから、schema.iniを読み込み側が用意すれば言いだけなのではないですか?
    CSVを出力する側が用意する決まりがあるわけでもないですし。
引用返信 削除キー/
■34118 / inTopicNo.5)  Re[2]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ Iraquser 一般人(2回)-(2019/02/05(Tue) 13:55:40)
http://Win10 c#
  • アイコンNo34116に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士さん、お世話になります。

    > データ中に「改行」「"」「,」などの特殊文字を含むような CSV で無いのなら、
    > File.ReadAllLines を Split するような LINQ 式で処理した方が手っ取り早いかも。
    そうですね。No34116のCSV例では含んでいませんが、実際のデータは改行を
    含みます。

    > もし、Jet/ACE を使って取り込む方法を採用するのであれば、
    > 取りうる選択肢としては下記の 3 通り。
    案1に関して同様のプランを検討しましたが、CSVが吐き出されるフォルダ
    が顧客側領域にあり、我々に更新権限がないため schema.ini の動的配置は難
    しく諦めた経緯があります。

    案2・案3の提案、ありがとうございます。当プログラムが動作する可能性の
    ある全PCのレジストリを顧客側各支店担当者様に更新して頂く事、あまりに
    も恐ろしく、尻込みしておりました。

    Jet/ACE を利用する以上、数字のみで構成されたフィールドは自動的に整数と
    認識されてしまう事、仕方のない事と理解しました。CSV入力プログラムの
    独自開発や案1〜3を含め、もう少し検討したいと思います。
    ありがとうございました。

引用返信 削除キー/
■34119 / inTopicNo.6)  Re[1]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ Iraquser 一般人(4回)-(2019/02/05(Tue) 14:02:57)
http://Win10 c#
  • アイコンNo34114に返信(Iraquserさんの記事)
    自己レスです。[解決済み]のチェックを忘れてました。

解決み!
引用返信 削除キー/
■34120 / inTopicNo.7)  Re[3]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ 魔界の仮面弁士 大御所(1194回)-(2019/02/05(Tue) 14:12:34)
  • アイコン2019/02/05(Tue) 14:18:11 編集(投稿者)

    # 解決済みチェックはそのままにしておきます。

    No34118に返信(Iraquserさんの記事)
    > 案1に関して同様のプランを検討しましたが、CSVが吐き出されるフォルダ
    > が顧客側領域にあり、我々に更新権限がないため schema.ini の動的配置は難
    > しく諦めた経緯があります。

    読み取り権限があるのなら、対象の CSV ファイルを
    Schema.ini を配置しておいた「一時作業用フォルダー」に
    コピーすることで回避できるのではないでしょうか。


    サイズが大きくて、ファイルのコピー負荷が問題になるようであれば、
    ハードリンクもしくはシンボリックリンクを試してみるとか。
解決み!
引用返信 削除キー/
■34129 / inTopicNo.8)  Re[4]: 数字だけで構成されてるCSVフィールドが自動的に数値として解釈される
□投稿者/ Iraquser 一般人(5回)-(2019/02/08(Fri) 11:10:53)
http://Win10 c#
  • アイコンNo34120に返信(魔界の仮面弁士さんの記事)

    > 読み取り権限があるのなら、対象の CSV ファイルを
    > Schema.ini を配置しておいた「一時作業用フォルダー」に
    > コピーすることで回避できるのではないでしょうか。
    はい、そうだと思います。検討案のひとつでした。

    結局、CSV解析プログラムの独自開発と言う事に決着しました。この部分を
    開発する要員として、顧客側の若手社員様を割り当てる(押し付けられる)事
    が決まっておりましたため、できる限りシンプルな構造にしたかったんです。
    でも、複数の(ソース管理すら出来てない)プログラムが吐いたCSVを解析
    するプログラムの設計・開発は、プログラミングに不慣れな顧客側若手社員様
    には荷が重いと判断し、自社の要員に担当させる事で顧客の了承を頂きました。

    丁寧なアドバイス、ありがとうございました」。

引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -