C# 在C中读取CSV文件#

C# 在C中读取CSV文件#,c#,excel,csv,exceldatareader,C#,Excel,Csv,Exceldatareader,我有以下导入excel文档并对其进行解析的代码,以便在将数据保存到数据库之前对其进行操作 我可以很好地解析.xlsx和.xls文件,但无法理解如何将现有代码用于.csv文件 我为之工作的客户希望使用.csv文件类型来接受特殊字符 OpenFileDialog opener = new OpenFileDialog(); opener.Filter = "Excel Files| *.xlsx;*.xls;*.csv;"; if (opener.ShowDialog() == DialogResu

我有以下导入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(字符串文件路径)
{
//receiverList=新列表();
尝试
{
if(filepath==string.Empty)
返回;
使用(StreamReader sr=newstreamreader(FileUpload1.PostedFile.InputStream))
{
弦线;
而((line=sr.ReadLine())!=null)
{
分裂线;
}
}
#区域行添加测试
DataTable dt=新的DataTable();
如果(dt.Columns.Count==0)
{
添加(“名称”,类型(字符串));
添加(“邮件”,类型(字符串));
增加(金额),类型(双);
}
DataRow NewRow;
/*
foreach(收款人列表中的var项目)
{
NewRow=dt.NewRow();
NewRow[0]=item.Name+“”+item.姓氏;
NewRow[1]=item.Mail;
新行[2]=项目金额;
dt.Rows.Add(NewRow);
}
*/
grdRec.DataSource=dt;
grdRec.DataBind();
#端区
}
捕获(例外)
{
}
}//功能结束
此函数用于读取CSV文件,将参数加载到Datatable,并将网格的数据源设置为Datatable。这是一个ASP.NET网络表单代码。

专用void ReadCSVFile(字符串文件路径) { //receiverList=新列表(); 尝试 { if(filepath==string.Empty) 返回; 使用(StreamReader sr=newstreamreader(FileUpload1.PostedFile.InputStream)) { 弦线; 而((line=sr.ReadLine())!=null) { 分裂线; } } #区域行添加测试 DataTable dt=新的DataTable(); 如果(dt.Columns.Count==0) { 添加(“名称”,类型(字符串)); 添加(“邮件”,类型(字符串)); 增加(金额),类型(双); } DataRow NewRow; /* foreach(收款人列表中的var项目) { NewRow=dt.NewRow(); NewRow[0]=item.Name+“”+item.姓氏; NewRow[1]=item.Mail; 新行[2]=项目金额; dt.Rows.Add(NewRow); } */ grdRec.DataSource=dt; grdRec.DataBind(); #端区 } 捕获(例外) { } }//功能结束
此函数用于读取CSV文件,将参数加载到Datatable,并将网格的数据源设置为Datatable。这是一个ASP.NET网络表单代码。

假设您的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);
}
如果由于某种原因不能使用OLE,.NET类库实际上有一个CSV解析器。在我看来,它隐藏得很好,但很好:


假设您的
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);
}
如果由于某种原因不能使用OLE,.NET类库实际上有一个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")
{

   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
        }
    }
请参阅此链接

您能检查下面的代码吗?。这将对你有用

 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
        }
    }
请参阅此链接

您是否正在将行添加到列表中?我对C#相当陌生。是的,我把那一部分注释掉了。只需复制所有代码好吧,我想这只会循环遍历ReceiveList中已经存在的内容。这是我代码的一部分。您可以创建自己的类。您是否正在将行添加到列表中?我对C#相当陌生。是的,我把那一部分注释掉了。只需复制所有代码好吧,我想这只会循环遍历ReceiveList中已经存在的内容。这是我代码的一部分。您可以创建自己的类。阅读
csv
文件如果相当简单,请打开文件并逐行阅读。你说的特殊角色是什么意思?约翰——它有正确的库,但不是天生的。如果你是说
.Split(',')
,那可不是防弹的。如果您指的是Visual Basic解析器,那么它并不是真正逐行读取(在引用的CSV字段中可能会有返回等)。读取
CSV
文件如果相当简单,请打开该文件并逐行读取。你说的特殊角色是什么意思?约翰——它有正确的库,但不是天生的。如果你是说
.Split(',')
,那可不是防弹的。如果您指的是VisualBasic解析器,那么它实际上不是逐行读取(在引用的CSV字段中可能会有返回,等等)。实际上处理CSV文件。实际上处理CSV文件。