【问题标题】:Missing Columns in DataSet when importing from Text File从文本文件导入时数据集中缺少列
【发布时间】:2015-03-18 00:07:12
【问题描述】:

我正在尝试通过 C# 将管道分隔的文本文件导入数据集。有些列没有导入标题。

这是我的源数据:

Apple|Orange|Banana|Grape|Mango|Guava|Apricot|Pear|Peach
0C025X0|530335|WEROERWORUWEORWEU||Misc.||0|1|0

这是我的代码:

         bool conversionStatus = true;

         //instantiate new Excel Object
        Application xlApp = new Application();
        _Workbook wb = null;
        if (xlApp == null)
        {
            Console.WriteLine("Excel is not properly installed!!");
            Console.ReadLine();
            return false;
        }


        //OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No;FMT=TabDelimited\"");
        OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No\"");
        conn.Open();

        OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(filePath), conn);

        DataSet ds = new DataSet("Temp");
        adapter.Fill(ds);

我的格式设置在一个 schema.ini 文件中,如下所示:

[Master.txt]
Format=Delimited(|)
ColNameHeader=False

以下是数据在数据集中的样子。

有谁知道为什么有些标题被包含,而有些则没有?

【问题讨论】:

    标签: c# data-import


    【解决方案1】:

    我可以重现您的情况,我已经解决了将 schema.ini 文件更改为

    [Master.txt]
    Format=Delimited(|)
    ColNameHeader=False
    Col1=Name1 Text Width 100
    Col2=Name2 Text Width 100
    Col3=Name3 Text Width 100
    Col4=Name4 Text Width 100
    Col5=Name5 Text Width 100
    Col6=Name6 Text Width 100
    Col7=Name7 Text Width 100
    Col8=Name8 Text Width 100
    Col9=Name9 Text Width 100
    

    使用示例name and type 设置列列表似乎可以解决问题。

    经过一番研究,我注意到缺失值来自具有冲突类型值的列。

    例如,列 F2 应该在第一行包含单词 ORANGE,但下一行包含一个数字,并且在所有其他缺少值的列中都会发生同样的情况。所以我认为文本驱动程序已决定为列赋予数字类型,当然,不能表示该列中的字符串值。
    现在要检查这个理论,我已将这些行添加到您的代码中:

    adapter.Fill(ds);
    DataTable dt = ds.Tables[0];
    Console.WriteLine(dt.Columns["F2"].DataType);  // prints Int32
    

    宾果游戏。驱动程序已为 F2 列选择了 Int32 数据类型,并且此处无法显示单词 ORANGE。

    要修复它,您可以将列名及其数据类型添加到您的 schema.ini 中,以避免实际列值之间出现歧义。

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2015-08-02
      • 1970-01-01
      相关资源
      最近更新 更多