2

基本上我有一个 C# 桌面应用程序,可以将 txt/csv 文件中的数据上传到数据库中。我做类似的事情:

OdbcConnection conn;
conn = new OdbcConnection(strConnString.Trim());
conn.Open();

sql_select = "select * from [" + this.csvFilePath.Trim() + "]";

这个想法是让用户决定分隔符是什么,比如“;” 或“,”或“#”,或任何..

因此,当分隔符是“,”之外的任何内容时,应用程序运行良好......但是当我选择使用它时,我收到一个错误,告诉我字段分隔符与小数分隔符重合。

问题是在我的位置,十进制的分隔符是“,”。我发现将控制面板上的小数分隔符更改为“。” 而不是“,”让应用程序工作。

我的问题是,有没有办法让应用程序设置默认分隔符?

4

4 回答 4

0

检查这个问题,它可能会引导你找到你的解决方案:

如何修复有小数分隔符问题的应用程序

正确的问题可能是 TL;DR,但第一个答案与您的问题及其解决方案有关。您将基本上使用应用程序线程的CultureInfo 类实例来使应用程序使用给定的文化。这样您就可以更改您正在使用的小数分隔符,而无需更改操作系统使用的分隔符。

据我所知,您可以提供自己的自定义文化,因此您可以将小数点分隔符设置为您喜欢的任何内容。

于 2013-06-06T19:29:55.040 回答
0

虽然您可以使用 API 调用来设置操作系统的默认分隔符,但这可能会惹恼用户。更好的选择是在文件字符串中的分隔符上运行查找和替换,将用户输入的任何分隔符更改为一些自定义分隔符(为此目的设计了 ASCII 字符 30)。然后始终使用该自定义分隔符将数据解析到您的文件中。当然,之后不要将更改保存到文件中。

此页面包含由 ASCII 标准定义的所有字符的列表。

于 2013-06-06T19:34:59.163 回答
0
var yourCulture = new CultureInfo("EN-US");
yourCulture.NumberFormat.NumberDecimalSeparator = ";"; // an arbitrary separator
Thread.CurrentThread.CurrentCulture = yourCulture;
Console.WriteLine(1.5);                          // -> 1;5
Console.WriteLine(Convert.ToDouble("1;5") + 1);  // -> 2;5
于 2013-06-06T19:41:23.883 回答
0

这些解决方案都不适合我……即使我可以更改 CurrentCulture,我仍然收到错误“字段分隔符 = 十进制分隔符”。

但是因为我很笨,我忘了正确设置schema.ini。这是我得到的:

    private void writeSchema()
    {
        try
        {
            FileStream fsOutput = new FileStream(this.dirCSV + "\\schema.ini", FileMode.Create, FileAccess.Write);
            StreamWriter srOutput = new StreamWriter(fsOutput);
            string s1, s2, s3, s4, s5, s6, s7, s8;

            s1 = "[" + this.FileNevCSV + "]";
            s2 = "ColNameHeader=" + chkFirstRowColumnNames.Checked.ToString();
            s3 = "Format=" + this.strFormat;
            s4 = "MaxScanRows=25";
            s5 = "CharacterSet=" + this.strEncoding;
            s6 = "DecimalSymbol=.";
            s7 = "CurrencyDecimalSymbol=.";

            srOutput.WriteLine(s1.ToString() + "\r\n" + s2.ToString() + "\r\n" + s3.ToString() + "\r\n" + s4.ToString() + "\r\n" + s5.ToString() + "\r\n" + s6.ToString() + "\r\n" + s7.ToString());
            srOutput.Close();
            fsOutput.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "writeSchema");
        }
        finally
        { }
    }

这让该死的东西工作得很好。感谢大家的帮助!

于 2013-06-07T13:05:59.820 回答