【问题标题】:Read .csv to datatable and fill a datagridview将 .csv 读取到数据表并填充数据网格视图
【发布时间】:2016-09-11 08:52:30
【问题描述】:

我有一个 .csv 文件,我想将它读入数据网格视图(每个值都读入每一列)。 我用块注释阅读了这个文件,我看到每个值都被“;”除以

我试图设置一个数据表,但它不起作用。这是我的代码:

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;

我不明白哪里出错了。

【问题讨论】:

  • @MichalHainc 网格为空
  • 参见Schema.ini 指定分隔符、十进制符号等

标签: c# csv datagridview datatable


【解决方案1】:

您的代码照原样为我工作。

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

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

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

表格完整代码:

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 文件功能

【讨论】:

  • 你能发布你的工作代码吗?所以我可以复制和粘贴。谢谢:)
  • 它不工作。我的值不只是在我的 csv 文件的列中。单独的符号是“;”。可能是这个问题吗? :)
  • 好的,它可以工作,但我有一个小问题:三列中的值是这样的:“1.50”,但是这段代码删除了“。”我怎样才能保留它?
  • 完成,但请进来聊天
【解决方案2】:

我用这个函数很久很久了,之后: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;
    }

试试……

【讨论】:

  • 我很少使用 C#,所以...如何在我的 datagridview 中添加它?谢谢:)
  • 数据表 oDt = CsvDb("youfilecsv", ";"); datagridview.Datasource = oDt; oDt.Dispose;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
相关资源
最近更新 更多