Чтение CSV-файлов на языке C#

У меня есть следующий код, который импортирует документы excel и анализирует их, чтобы я мог манипулировать данными, прежде чем они будут сохранены в базе данных.

Я могу разобрать .xlsx и .xls файлы просто отлично, но не может выяснить, как использовать мой существующий код для .CSV-файл

клиент, на которого я работаю, хочет использовать .тип файла csv для приема специальных символов.

OpenFileDialog opener = new OpenFileDialog();
opener.Filter = "Excel Files| *.xlsx;*.xls;*.csv;";
if (opener.ShowDialog() == DialogResult.Cancel)
    return;

FileStream streamer = new FileStream(opener.FileName, FileMode.Open);
IExcelDataReader reader;
if (Path.GetExtension(opener.FileName) == ".xls")
{
    reader = ExcelReaderFactory.CreateBinaryReader(streamer);
}
else if (Path.GetExtension(opener.FileName) == ".csv")
{

    *** Need Something Here to read CSV Files that will work with 
        the rest of code***
}
else
{
    reader = ExcelReaderFactory.CreateOpenXmlReader(streamer);
}
DataSet results = reader.AsDataSet();
results.Tables[0].Rows[0].Delete();
results.AcceptChanges();


foreach (System.Data.DataTable table in results.Tables)
{
    foreach (DataRow dr in table.Rows)
    {
       >>> Do Something With the Data
    }
}

3 ответа

  1.         private void ReadCSVFile(string filepath)
        {
            //receiverList = new List<ReceiverUser>();
    
            try
            {
                if (filepath == string.Empty)
                    return;
    
                using (StreamReader sr = new StreamReader(FileUpload1.PostedFile.InputStream))
                {
                    string line;
    
                    while ((line = sr.ReadLine()) != null)
                    {
                        SplitLine(line);
                    }
                }
    
                #region row add test
                DataTable dt = new DataTable();
    
                if (dt.Columns.Count == 0)
                {
                    dt.Columns.Add("Name", typeof(string));
                    dt.Columns.Add("Mail", typeof(string));
                    dt.Columns.Add("Amount", typeof(double));
                }
    
                DataRow NewRow;
    

    /*
    foreach (элемент var в receiverList)
    {
    NewRow = dt.NewRow();
    NewRow[0] = item.Name + «» + item.Фамилия;
    NewRow[1] = item.Почта;
    NewRow[2] = item.Сумма;
    Второзаконие.Строки.Добавить (NewRow);
    }
    */

                grdRec.DataSource = dt;
                grdRec.DataBind();
    
                #endregion
            }
            catch (Exception)
            {
    
            }
    
        }//end of function
    

    Эта функция считывает CSV-файл, загружает параметры в Datatable и устанавливает источник данных grid как Datatable. Это ASP.NET код WebfoRM.

  2. Предполагая, что ваш IExcelDataReaderявляется пакетом третьей стороны, который читает файлы Excel (довольно безопасная ставка), и он не изначально обрабатывает CSV (эта часть я не уверен), то вы всегда можете просто обрабатывать CSV полностью отдельно.

    OLE имеет хороший читатель CSV, так что что-то вроде этого должно работать.

    List<DataTable> tables = new List<DataTable>();
    
    if (Path.GetExtension(opener.FileName) == ".csv")
    {
        OleDbConnection conn = new OleDbConnection(string.Format(
            @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};" +
            "Extended Properties=\"Text;HDR=YES;FMT=Delimited\"",
            opener.FileName
        ));
        conn.Open();
    
        string sql = string.Format("select * from [{0}]", Path.GetFileName(opener.FileName));
        OleDbCommand cmd = new OleDbCommand(sql, conn);
        OleDbDataReader reader = cmd.ExecuteReader();
    
        DataTable dt = new DataTable();
        dt.Load(reader);
        tables.Add(dt);
    
        reader.Close();
    }
    else
    {
        FileStream streamer = new FileStream(opener.FileName, FileMode.Open);
        IExcelDataReader reader = null;
        if (Path.GetExtension(opener.FileName) == ".xls")
            reader = ExcelReaderFactory.CreateBinaryReader(streamer);
        else
            reader = ExcelReaderFactory.CreateOpenXmlReader(streamer);
        DataSet results = reader.AsDataSet();
        results.Tables[0].Rows[0].Delete();
        results.AcceptChanges();
    
        foreach (DataTable table in results.Tables)
            tables.Add(table);
    }
    

    А затем просто ссылайтесь на свой локальный список datatables (tables) вместо Results.Tables,того, как это теперь локально ограничено IExcelReader.

    foreach (System.Data.DataTable table in tables)
    {
        foreach (DataRow dr in table.Rows)
        {
           >>> Do Something With the Data
        }
    }
    

    Если вы не можете использовать OLE по какой-то причине, библиотека классов .NET фактически имеет синтаксический анализатор CSV. Это довольно хорошо скрыто, на мой взгляд, но это хорошо:

    http://odedcoster.com/blog/2012/03/28/did-you-know-a-net-csv-parser-that-comes-with-visual-studio/

  3. Вы можете проверить ниже код?. Это будет Вам полезно.

     OpenFileDialog opener = new OpenFileDialog();
       opener.Filter = "Excel Files| *.xlsx;*.xls;*.csv;";
    if (opener.ShowDialog() == DialogResult.Cancel)
        return;
    
    FileStream streamer = new FileStream(opener.FileName, FileMode.Open);
    IExcelDataReader reader;
    if (Path.GetExtension(opener.FileName) == ".xls")
    {
        reader = ExcelReaderFactory.CreateBinaryReader(streamer);
    }
    else if (Path.GetExtension(opener.FileName) == ".csv")
    {
    
       var reader = ExcelReaderFactory.CreateReader(stream, new ExcelReaderConfiguration() {
    
    // Gets or sets the encoding to use when the input XLS lacks a CodePage
    // record, or when the input CSV lacks a BOM and does not parse as UTF8. 
    // Default: cp1252. (XLS BIFF2-5 and CSV only)
    FallbackEncoding = Encoding.GetEncoding(1252),
    
    // Gets or sets the password used to open password protected workbooks.
    Password = "password",
    
    // Gets or sets an array of CSV separator candidates. The reader 
    // autodetects which best fits the input data. Default: , ; TAB | # 
    // (CSV only)
    AutodetectSeparators = new char[] { ',', ';', '\t', '|', '#' };
    });
        }
        else
        {
            reader = ExcelReaderFactory.CreateOpenXmlReader(streamer);
        }
        DataSet results = reader.AsDataSet();
        results.Tables[0].Rows[0].Delete();
        results.AcceptChanges();
    
    
        foreach (System.Data.DataTable table in results.Tables)
        {
            foreach (DataRow dr in table.Rows)
            {
               >>> Do Something With the Data
            }
        }
    

    См. эту ссылку
    ExcelDataReader