【问题标题】:OdbcConnection Text Driver ignores scheme.ini settingsOdbcConnection 文本驱动程序忽略 scheme.ini 设置
【发布时间】:2012-08-24 11:25:24
【问题描述】:

这是我的代码:

            OdbcConnection conn = new OdbcConnection("Driver={Microsoft Text Driver (*.txt; *.csv)};DSN=scrapped.csv");
        conn.Open();
        OdbcCommand foo = new OdbcCommand(@"SELECT * FROM [scrapped.csv] WHERE KWOTA < 100.00", conn);
        IDataReader dr = foo.ExecuteReader();
        StreamWriter asd = new StreamWriter("outfile.txt");
        while (dr.Read())
        {
            int cols = dr.GetSchemaTable().Rows.Count;
            for (int i = 0; i < cols; i++)
            {
                asd.Write(string.Format("{0};",dr[i].ToString()));
            }
            asd.WriteLine();
        }
        asd.Flush();
        asd.Close();
        dr.Close();
        conn.Close();

这是我的 Scheme.ini

      [scrapped.csv]

Format=Delimited(;)
NumberDigits=2
CurrencyThousandSymbol= 
CurrencyDecimalSymbol=,
CurrencyDigits=2

Col1=DataOperacji Date
Col2=DataKsiegowania Date
Col3=OpisOperacji Text
Col4=Tytul Text
Col5=NadawcaOdbiorca Text
Col6=NumerKonta Text
Col7=Kwota Currency
Col8=SaldoPoOperacji Currency

这里有来自我的 CSV 的示例:

2013-01-22;2013-08-24;notmatter;"notmatter";"notmatter";'notmatter';7 111,55;10 222,20;
2013-03-26;2013-08-23;notmatter;"notmatter";"notmatter";'notmatter';-275,00;15 466,24;

因此,即使我在 scheme.ini 中设置了日期和货币,而我写入输出文件的区域设置(odbc 应该默认使用但不是)值也是一团糟。

如果有空格(我的本地 thousend 分隔符)它们是空的,如果我的值像 15,45 我得到了 15,4500。

日期字段也表现异常,即使我插入到scheme.ini DateTimeFormat,我也得不到我在格式中指定的任何东西。

任何帮助将不胜感激,如何处理,我想使用 ODBC 并使用 WHERE something = something 查询类似数据库的 CSV 数据

【问题讨论】:

    标签: c# csv odbc


    【解决方案1】:

    我在您的 schema.ini 中添加了一行并针对 adodb 连接运行,它在日期问题上对我有用,其他位仍然不正确。注意日期时间格式。

    [scrapped.csv]
    Format=Delimited(;)
    NumberDigits=2
    CurrencyThousandSymbol= 
    CurrencyDecimalSymbol=,
    CurrencyDigits=2
    DateTimeFormat="yyyy-mm-dd"
    
    Col1=DataOperacji Date
    Col2=DataKsiegowania Date
    Col3=OpisOperacji Text
    Col4=Tytul Text
    Col5=NadawcaOdbiorca Text
    Col6=NumerKonta Text
    Col7=Kwota Currency
    Col8=SaldoPoOperacji Currency
    

    您可能还需要:

    ColNameHeader=False
    MaxScanRows=0
    

    但目前,我看不到一种方法可以让空间被接受为 CurrencyThousandSymbol

    【讨论】:

    • 我得到“2011-09-16 00:00:00” 我想我可能只会得到“2011-09-16”,如果我查询 SELECT * FROM [scrapped.csv] where (DataOperacji BETWEEN "2011-02-02" AND "2011-04-04") 我得到一个数据类型错误 @987654324 @
    • 您是否添加了我建议的额外行?添加它们后,我可以运行此"SELECT * FROM [scrapped.csv] WHERE DataOperacji=#2013/03/26#"
    • 我也添加了这些行,您的查询也适用于我。为什么要标签? #2013/03/26# 看起来查询中的这种格式是可以的,而我的不是。我也在考虑使用货币作为浮点值的解决方法,不用担心。但是对于 Float,我也有千位分隔符的问题,我可以编写脚本来从最后两个列中删除空格,但这太 hacky。
    • 哈希标签是 Jet/Ace 驱动程序的日期分隔符,这是文本驱动程序的来源。我能想象摆脱该空间的唯一方法是在文本字段中。
    • 我只是在我的 csv 上运行这样的脚本,之后我可以将这些值用作浮点数:File.open('out.csv', 'w') do |f2| File.readlines('scrapped.csv').each do |line| arr = line.split(';') arr[arr.length-1] = arr[arr.length-1].delete(" ") arr[arr.length-2] = arr[arr.length-2].delete(" ") line2 = arr.join(";") f2.puts line2 end end 但这不是我每次 ofc 都想做的事情 :)跨度>
    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多