将.csv读取到datatable并填充datagridview

时间:2016-09-11 08:52:30

标签: c# csv datagridview datatable

我有一个.csv文件,我想将它读入datagridview(每个列中的每个值)。 我用块注释读取这个文件,我看到每个值除以&#34 ;;"

我尝试设置数据表,但它无法正常工作。这是我的代码:

string FileName = @"C:\mydir\testcsv.csv";

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(FileName) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"");
conn.Open();

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(FileName), conn);    
DataSet ds = new DataSet("Temp");
adapter.Fill(ds);

conn.Close();

dataGridView2.DataSource = ds;

我不明白错误在哪里。

2 个答案:

答案 0 :(得分:1)

您的代码原样适用于我。

在查看数据集内部后,我刚刚在数据源分配中添加了一行,我看到只有一个表在里面,名称为“Table”,所以我分配了datagridview的数据库:

        dataGridView1.DataSource = ds;
        dataGridView1.DataMember = "Table";

无论如何,如果我使用';'分隔符,所有值都在一列中......使用','逗号分隔符,它可以正常工作。

It looks like this

表格的完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string FileName = @"C:\mydir\testcsv.csv";

            OleDbConnection conn = new OleDbConnection
                   ("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " +
                     Path.GetDirectoryName(FileName) +
                     "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"");

            conn.Open();

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

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

            conn.Close();

            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "Table";
        }
    }
}

csv文件的内容:

abc,123
def,456
ijk,789
lmn,111213

对于以分号分隔的文件,您需要在包含csv文件的文件夹中添加ini文件。这里有如何描述:

How to specify the delimiter when importing CSV files via OLEDB in C#

对于小数分隔符号,您必须添加

DecimalSymbol

指向您的Jet ini文件。

查看MSDN(https://msdn.microsoft.com/en-us/library/ms709353(v=vs.85).aspx

中记录的完整ini文件功能

答案 1 :(得分:1)

我在很久很久之后使用这个函数:yourgrid.datasource = function result。

        public static DataTable CsvDb(string filename, string separatorChar)
    {
        var table = new DataTable("Filecsv");
        using (var sr = new StreamReader(filename, Encoding.Default))
        {
            string line;
            var i = 0;
            while (sr.Peek() >= 0)
            {
                try
                {
                    line = sr.ReadLine();
                    if (string.IsNullOrEmpty(line)) continue;
                    var values = line.Split(new[] { separatorChar }, StringSplitOptions.None);
                    var row = table.NewRow();
                    for (var colNum = 0; colNum < values.Length; colNum++)
                    {
                        var value = values[colNum];
                        if (i == 0)
                        {
                            table.Columns.Add(value, typeof(String));
                        }
                        else
                        { row[table.Columns[colNum]] = value; }
                    }
                    if (i != 0) table.Rows.Add(row);
                }
                catch (Exception ex)
                {
                    string cErr = ex.Message;
                    //if you need the message error
                }
                i++;
            }
        }
        return table;
    }

...试