【问题标题】:Populating a dataset from a CSV file从 CSV 文件填充数据集
【发布时间】:2013-05-12 11:40:48
【问题描述】:

我想读取 CSV 文件的内容并创建数据集。 我正在尝试这样:

var lines = File.ReadAllLines("test.csv").Select(a => a.Split(';'));
DataSet ds = new DataSet();
ds.load(lines);

但显然这是不正确的。

【问题讨论】:

  • 为什么你认为它不正确?

标签: c# asp.net .net csv dataset


【解决方案1】:

您需要针对 CSV 文件运行 SELECT 语句来填充数据集:

编辑:这是来自http://carllbrown.blogspot.co.uk/2007/09/populate-dataset-from-csv-delimited_18.html 的一些示例代码

string FileName = ...
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();

【讨论】:

  • 该方法1+,但您最好添加示例代码,而不是添加指向博客文章的链接
  • 好吧,ds 已创建,但我无法访问它/查看 csv 文件中的数据
  • 如何从数据集中创建新表,如何知道故事名称
【解决方案2】:

然后你可以使用 Fast CSV Reader 这样的库

using System.IO;
using LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CsvReader csv = new CsvReader(
                           new StreamReader("data.csv"), true))
    {
        myDataRepeater.DataSource = csv;
        myDataRepeater.DataBind();
    }
}

【讨论】:

  • 我不明白为什么不赞成。这是一个很好的帮手。例如,用逗号分隔的 CSV 文件的图像在 ["hello", "hi", "hello, how are you"] 等字段中也有逗号。如果您使用 String.Split(','),最后一个条目将被分成两个,但它应该是一个。除了其他事情之外,CsvReader 还会为您处理这些事情。所以,强烈推荐。
【解决方案3】:

您需要添加引用 Microsoft.VisualBasic.dll 才能使用 TextFieldParser 类。

 private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        {
            DataTable csvData = new DataTable();
            try
            {
              using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
                 {
                    csvReader.SetDelimiters(new string[] { "," });
                    csvReader.HasFieldsEnclosedInQuotes = true;
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn datecolumn = new DataColumn(column);
                        datecolumn.AllowDBNull = true;
                        csvData.Columns.Add(datecolumn);
                    }
                    while (!csvReader.EndOfData)
                    {
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }
                        csvData.Rows.Add(fieldData);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return csvData;
        }
      }

查看这篇文章了解更多信息:http://www.morgantechspace.com/2013/08/how-to-read-data-from-csv-file-in-c.html

【讨论】:

  • TextFieldParser 是从哪里来的?
  • 您好 @RobSedgwick ,您需要添加引用 Microsoft.VisualBasic.dll 才能使用 TextFieldParser 类。
【解决方案4】:

如果您只是想快速创建一个填充了来自 CSV 文件(或直接从 Excel 粘贴)的示例数据的 DataTable 来玩转或原型,那么您可以使用我的 Shan Carter 先生数据转换器的分支——我最近添加了将逗号和制表符分隔的数据输出到 C# DataTable 的功能。

http://thdoan.github.io/mr-data-converter/

【讨论】:

  • 如何输出 Class/ 实体并将文件写入磁盘。 ExportToClass(String FileNameToWrite)我想从头文件中获取 C# 类/模型
【解决方案5】:

我在下面写了五种方法,可以将 Csv 文件转换为 DataTable。

它们的设计考虑了可选引号(例如 " 符号),并且在不使用其他库的情况下尽可能多用途:

    public static DataTable GetDataTabletFromCSVFile(string filePath, bool isHeadings)
    {
        DataTable MethodResult = null;
        try
        {
            using (TextFieldParser TextFieldParser = new TextFieldParser(filePath))
            {
                if (isHeadings)
                {
                    MethodResult = GetDataTableFromTextFieldParser(TextFieldParser);

                }
                else
                {
                    MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser);

                }

            }

        }
        catch (Exception ex)
        {
            ex.HandleException();
        }
        return MethodResult;
    }

    public static DataTable GetDataTableFromCsvString(string csvBody, bool isHeadings)
    {
        DataTable MethodResult = null;
        try
        {
            MemoryStream MemoryStream = new MemoryStream();


            StreamWriter StreamWriter = new StreamWriter(MemoryStream);

            StreamWriter.Write(csvBody);

            StreamWriter.Flush();


            MemoryStream.Position = 0;


            using (TextFieldParser TextFieldParser = new TextFieldParser(MemoryStream))
            {
                if (isHeadings)
                {
                    MethodResult = GetDataTableFromTextFieldParser(TextFieldParser);

                }
                else
                {
                    MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser);

                }

            }

        }
        catch (Exception ex)
        {
            ex.HandleException();
        }
        return MethodResult;
    }

    public static DataTable GetDataTableFromRemoteCsv(string url, bool isHeadings)
    {
        DataTable MethodResult = null;
        try
        {
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

            StreamReader StreamReader = new StreamReader(httpWebResponse.GetResponseStream());

            using (TextFieldParser TextFieldParser = new TextFieldParser(StreamReader))
            {
                if (isHeadings)
                {
                    MethodResult = GetDataTableFromTextFieldParser(TextFieldParser);

                }
                else
                {
                    MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser);

                }

            }

        }
        catch (Exception ex)
        {
            ex.HandleException();
        }
        return MethodResult;
    }


    private static DataTable GetDataTableFromTextFieldParser(TextFieldParser textFieldParser)
    {
        DataTable MethodResult = null;
        try
        {
            textFieldParser.SetDelimiters(new string[] { "," });

            textFieldParser.HasFieldsEnclosedInQuotes = true;


            string[] ColumnFields = textFieldParser.ReadFields();

            DataTable dt = new DataTable();

            foreach (string ColumnField in ColumnFields)
            {
                DataColumn DataColumn = new DataColumn(ColumnField);

                DataColumn.AllowDBNull = true;

                dt.Columns.Add(DataColumn);

            }


            while (!textFieldParser.EndOfData)
            {
                string[] Fields = textFieldParser.ReadFields();


                for (int i = 0; i < Fields.Length; i++)
                {
                    if (Fields[i] == "")
                    {
                        Fields[i] = null;

                    }

                }

                dt.Rows.Add(Fields);

            }

            MethodResult = dt;

        }
        catch (Exception ex)
        {
            ex.HandleException();
        }
        return MethodResult;
    }

    private static DataTable GetDataTableFromTextFieldParserNoHeadings(TextFieldParser textFieldParser)
    {
        DataTable MethodResult = null;
        try
        {
            textFieldParser.SetDelimiters(new string[] { "," });

            textFieldParser.HasFieldsEnclosedInQuotes = true;

            bool FirstPass = true;

            DataTable dt = new DataTable();

            while (!textFieldParser.EndOfData)
            {
                string[] Fields = textFieldParser.ReadFields();

                if(FirstPass)
                {
                    for (int i = 0; i < Fields.Length; i++)
                    {
                        DataColumn DataColumn = new DataColumn("Column " + i);

                        DataColumn.AllowDBNull = true;

                        dt.Columns.Add(DataColumn);

                    }

                    FirstPass = false;

                }

                for (int i = 0; i < Fields.Length; i++)
                {
                    if (Fields[i] == "")
                    {
                        Fields[i] = null;

                    }

                }

                dt.Rows.Add(Fields);

            }

            MethodResult = dt;

        }
        catch (Exception ex)
        {
            ex.HandleException();
        }
        return MethodResult;
    }

如果您像我一样从报告服务中保存,那么您应该像这样使用它:

    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string filenameExtension;

    byte[] bytes = rvMain.ServerReport.Render("csv", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);

    string CsvBody = System.Text.Encoding.UTF8.GetString(bytes);

    DataTable dt = GetDataTableFromCsvString(CsvBody,true);

否则,您只需:

    bool IsHeadings = true; //Does the data include a heading row?

    DataTable dt = GetDataTableFromCsvString(CsvBody, IsHeadings);

或者直接从 csv 文件中使用

    bool IsHeadings = true; //Does the data include a heading row?

    DataTable dt = GetDataTabletFromCsvFile(FilePath, IsHeadings)

或者使用远程存储的 csv 文件

    bool IsHeadings = true; //Does the data include a heading row?

    DataTable dt = GetDataTabletFromRemoteCsv(Url, IsHeadings)

Dataset 是 DataTables 的集合,所以像这样创建一个:

    DataSet ds = new DataSet();

    ds.Tables.Add(dt);

【讨论】:

    【解决方案6】:

    此代码中解决的逗号 (,) 问题

    即使在单元格之间添加逗号(,) 也有效

    读取 CSV 文件代码:

    public MainWindow()
                    {
                        InitializeComponent();
    
                        DataTable dtDataSource = new DataTable();
    
                        string[] fileContent = File.ReadAllLines(@"..\\Book1.csv");
    
                        if (fileContent.Count() > 0)
                        {
                            //Create data table columns dynamically
                            string[] columns = fileContent[0].Split(',');
    
                            for (int i = 0; i < columns.Count(); i++)
                            {
                                dtDataSource.Columns.Add(columns[i]);
                            }
    
                            //Add row data dynamically
                            for (int i = 1; i < fileContent.Count(); i++)
                            {
                                string[] rowData = fileContent[i].Split(',');
                                string[] realRowData = new string[columns.Count()];
                                StringBuilder collaboration = new StringBuilder();
                                int v = 0;
    
                                //this region solves the problem of a cell containing ",".
                                #region CommaSepProblem
                                for (int j = 0, K = 0; j < rowData.Count(); j++, K++)
                                {
                                    if ((rowData[j].Count(x => x == '"') % 2 == 0))//checks if the string contains even number of DoubleQuotes
                                    {
                                        realRowData[K] = quotesLogic((rowData[j]));
    
                                    }
                                    else if ((rowData[j].Count(x => x == '"') % 2 != 0))//If Number of DoubleQuotes  are ODD
                                    {
                                        int c = rowData[j].Count(x => x == '"');
                                        v = j;
    
                                        while (c % 2 != 0)//Go through all the next array cell till it makes EVEN Number of DoubleQuotes.
                                        {
                                            collaboration.Append(rowData[j] + ",");
                                            j++;
                                            c += rowData[j].Count(x => x == '"');
    
                                        }
    
                                        collaboration.Append(rowData[j]);
                                        realRowData[K] = quotesLogic(collaboration.ToString());
                                    }
                                    else { continue; }
                                }
                                #endregion
                                dtDataSource.Rows.Add(realRowData);
                            }
                            if (dtDataSource != null)
                            {
                                //dataGridView1 = new DataGridView();
                                dataGrid1.ItemsSource = dtDataSource.DefaultView;
                            }
                        }
                    }
    

    需要添加的方法:

     string quotesLogic(string collaboration)
        {
            StringBuilder after = new StringBuilder(collaboration);
    
            if (after.ToString().StartsWith("\"") && after.ToString().EndsWith("\""))//removes 1st and last quotes as those are system generated
            {
                after.Remove(0, 1);
                after.Remove(after.Length - 1, 1);
                int count = after.Length - 1;
                //FACT: if you try to add DoubleQuote in a cell in excel. It'll save that quote as 2 times DoubleQuote(Like "")  which means first DoubleQuote is to give instruction to CPU that the next DoubleQuote  is not system generated.
                while (count > 0)//This loop find twice insertion of 2 DoubleQuotes and neutralise them to One DoubleQuote. 
                {
                    if (after[count] == '"' && after[count - 1] == '"')
                    {
                        after.Remove(count, 1);
                    }
                    count--;
                }
            }
    
            return after.ToString();
        }
    

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 2017-04-17
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多