【问题标题】:Using ODBC to select from a CSV file with spaces in column names使用 ODBC 从列名中包含空格的 CSV 文件中进行选择
【发布时间】:2016-07-20 02:54:26
【问题描述】:

我正在使用ODBCCSV 文件中进行查询。 CSV 文件包含列名(CSV 文件的第一行),其中一些包含空格。

我正在使用 C# 使用 OdbcCommand 对象执行查询(SQL SELECT 语句)

如果我什么都不做,我会收到一个 ODBC 错误,Syntax error (missing operator) in query expression '[column name here]'([此处的列名] 表示它只是将第一列的名称放入其中,其中包含空格)。

我尝试将列名括在方括号中,比如 SQL Server,但没有骰子。我试过双引号,我试过反引号。我试过撇号。

如果我使用其中任何一个,我会收到一条错误消息,指出 Too few parameters. Expected X 其中 X 是 1 或 3,具体取决于换行符。

我似乎在 CSV 文件中找不到任何指定如何执行此操作的内容。

它适用于列名中没有空格的 CSV 文件。

更新 1: 根据此 Microsoft 页面:https://msdn.microsoft.com/en-us/library/ms709353(v=vs.85).aspx 在列名的remarks 部分下,它显示“列的文本名称。如果列名包含嵌入的空格,则必须将其括在双引号中。”如前所述,我已经尝试过了。没用。

根据此 Microsoft 页面:https://msdn.microsoft.com/en-us/library/ms711819(v=vs.85).aspx 它说,“如果列名包含除字母、数字和下划线以外的任何字符,则必须通过将其括在反引号 (`) 中来分隔名称。”试过了。没用。

我正在使用 Microsoft 文本驱动程序(根据 ODBC 数据源管理器的用户 DSN 页面),但我没有在 ODBC 驱动程序页面上看到它。在该页面上,我看到了 SQL Server、SQL Server Native Client 和 ODBC Driver 11 for SQL Server(版本 2015.130.900.73)。

【问题讨论】:

  • 为什么不使用 System.IO StreamReader ?它工作得很好,如果你愿意,我可以给你这样做的代码(完全测试工作) - 对于 CSV 文件。
  • @KyleE4K 你的代码能让我对 CSV 文件执行 SQL 查询吗?
  • 它既不是 ODBC 也不是 SQL 原语,它只是读取每一列并将它们存储为行,就像 select 语句一样。然后你可以在上面添加你的 SQL 吗?
  • @KyleE4K 我需要一些可以执行 SQL 的东西。谢谢。
  • 您是否厌倦了在 SQL 查询中使用 REPLACE() 查询空格?以前从未见过这种行为,请向我们展示您的代码?我为你投票

标签: c# sql csv odbc


【解决方案1】:

这是我创建的一个可以正常工作的示例。我没有使用 DSN,但它给了你一个想法。

数据源(sampledata.csv)

第 1 栏、第 2 栏、第 3 栏
一些值,3,0.01
另一个值,1,1.2
再一次,2,3

schema.ini

[样本数据.csv]
格式=CSV 分隔
ColNameHeader=真
Col1 = "第 1 列" 文本
Col2 = "第 2 列" 长
Col3 = "第 3 列" 货币

代码

     string filePath = Path.GetDirectoryName(Application.ExecutablePath);
     string fileName = "sampledata.csv";
     string query = string.Empty;

     //query = "SELECT * FROM " + fileName;
     //query = "SELECT * FROM " + fileName + " WHERE [COLUMN 2] > 1";
     query = "SELECT * FROM " + fileName + " WHERE [COLUMN 3] > 0.02";

     // 32-bit
     // OdbcConnection conn = new OdbcConnection("Driver=Microsoft Text Driver (*.txt, *.csv);Dbq=" + filePath + ";Extensions=csv;");
     // 64-bit
     OdbcConnection conn = new OdbcConnection("Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" + filePath + ";Extensions=csv;");
     conn.Open();
     OdbcCommand cmd = new OdbcCommand(query, conn);
     OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
     DataSet mydata = new DataSet("CSVData");
     adapter.Fill(mydata);
     conn.Close();
     conn.Dispose();

     dataGridView1.AutoGenerateColumns = true;
     dataGridView1.DataSource = mydata;
     dataGridView1.DataMember = mydata.Tables[0].ToString();

在 schema.ini 中,列名周围使用引号。在查询中,括号的使用与常规 SQL 语句一样。

每个查询都按预期在网格中加载数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2023-04-06
    • 1970-01-01
    • 2021-08-14
    • 2015-02-08
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多