1

0,12 (小数点記号としてコンマ) のように書式設定されたいくつかの 10 進数値を含むタブ区切りのテキスト ファイルがあります。その内容を Provider=Microsoft.Jet.OLEDB.4.0 経由で OleDBDataReader に解析しましたが、結果を見ると、10 進数であるはずの値が DateTime に変換されていました。

アプリケーションにカンマを数値の小数点記号として理解させるにはどうすればよいですか? cultureinfo を en-US またはその他に変更しても機能しませんでした。

public static OleDbDataReader CriarOleDbDataReader(string sCaminhoArquivo)
    {
        FileInfo fi = new FileInfo(sCaminhoArquivo);

        string format;

        string linha;

        if (fi.Extension.ToLower().Equals(".csv"))
        {
            string texto = System.IO.File.ReadAllText(sCaminhoArquivo).Replace(',', ';');
            System.IO.File.WriteAllText(sCaminhoArquivo, texto);
            linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0];
            format = "Delimited(;)";
        }
        else
        {                
            linha = System.IO.File.ReadAllLines(sCaminhoArquivo)[0];
            format = (linha.Split('\t').Count() > 1) ? "TabDelimited" : "Delimited(;)";
        }

        DefinirSchema(fi, format);

        string cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fi.DirectoryName + ";Extended Properties='text;HDR=Yes';";

        OleDbConnection con = new OleDbConnection(cn);
        OleDbCommand cmd = new OleDbCommand("select * from [" + fi.Name + "]", con);
        OleDbDataReader dr;

        con.Open();

        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        return dr;

    }

フィールド "IOF" は 10 進数で、.txt ファイルの値は 0,02 ですが、datetime を返します。

dr["iof"]
{30/12/1899 00:02:00}
    Date: {30/12/1899 00:00:00}
    Day: 30
    DayOfWeek: Saturday
    DayOfYear: 364
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 2
    Month: 12
    Second: 0
    Ticks: 599264353200000000
    TimeOfDay: {00:02:00}
    Year: 1899
4

3 に答える 3

1

ちょうどそれを解決しました。ファイル内の各列のデータ型を決定しようとする schema.ini ファイルにさらに行を追加する必要がありました。ここでわかりました

これらの 2 つの赤ちゃんはトリックを行いました:

ColNameHeader=True

MaxScanRows=0

それが役に立てば幸い。

于 2013-09-06T13:33:22.067 に答える
0

これらのいずれかが必要です

1.

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("小数点ではなくコンマで区切られた任意のカルチャ");

    2.

あなたがアメリカの文化にいるなら

これは疑似コードであり、正確な構文ではありません

decimal.Parse("0,02").Split(",").Join("."))

3.

ファイルはタブ区切りです。OleDb を使用する代わりに、ストリームを使用してデータテーブルにロードします

于 2013-09-05T21:32:26.647 に答える