Подтвердить что ты не робот

Заполнение набора данных из файла CSV

Я хотел бы прочитать содержимое файла CSV и создать набор данных. Я пробую вот так:

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

но, по-видимому, это неверно.

4b9b3361

Ответ 1

Вам нужно запустить инструкцию SELECT в файле CSV для заполнения набора данных:

Изменить: здесь пример кода из 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();

Ответ 2

Вам нужно добавить ссылку 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

Ответ 3

Вы можете использовать библиотеку, например 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();
    }
}

Ответ 4

Запятая (,) Проблема, решаемая в этом коде

Работает даже если вы добавите запятую (,) между ячейкой

Чтение 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();
    }

Ответ 5

Если вы просто хотите быстро создать DataTable, заполненный образцами данных из файла CSV (или вставленного непосредственно из Excel), чтобы поиграть или прототип, тогда вы можете использовать мою вилку Shan Carter Mr. Data Converter - я недавно добавлена ​​возможность вывода данных с разделителями-запятыми и таблицами в С# DataTable.

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

Ответ 6

Я написал пять методов ниже, которые превратят 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)

A Dataset - это набор DataTables, поэтому создайте его так:

    DataSet ds = new DataSet();

    ds.Tables.Add(dt);