[英]Read CSV files in 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
}
}
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 item in 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 代碼。
假設您的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);
}
然后只需引用您的本地數據表列表( 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/
你能檢查下面的代碼嗎? 這將對您有用。
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
您可以使用CSVHelper來避免手動編寫 CVS 解析器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.