2017-01-17 2 views
0

У меня есть следующий код, который импортирует документы Excel и анализирует их, чтобы я мог манипулировать данными до их сохранения в базе данных.Чтение файлов CSV в C#

Я могу разобрать .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 
    } 
} 
+0

Чтение 'csv' файл, если достаточно просто открыть файл и прочитать его построчно. Что вы подразумеваете под особыми персонажами? – JohnG

+0

JohnG - Это правильная библиотека, но не изначально. Если вы имеете в виду '.Split (',')', это далеко не пуленепробиваемый. Если вы имеете в виду синтаксический анализатор Visual Basic, то это не * действительно * чтение по очереди (могут быть возвраты в поле цитированного CSV и т. Д.). – Hambone

ответ

0
 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; 

/* Еогеасп (вар элемент в receiverList) { NewRow = dt.NewRow(); NewRow [0] = item.Name + "" + item.Surname; NewRow [1] = item.Mail; NewRow [2] = item.Amount; dt.Rows.Add (NewRow); } */

  grdRec.DataSource = dt; 
      grdRec.DataBind(); 

      #endregion 
     } 
     catch (Exception) 
     { 

     } 

    }//end of function 

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

+0

Где-то вы добавляете строки в список? Я довольно новичок в C#. –

+0

Да, я прокомментировал этот раздел. Просто скопируйте весь код – onur

+0

Хорошо, я думал, что будет только проходить через то, что уже находится в recieverList. –

0

Предполагается, что ваш 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/