在C#中读取CSV文件

3

我有以下代码,可以导入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
    }
}

读取 csv 文件相当简单,只需打开文件并逐行读取即可。你所说的特殊字符是什么意思? - undefined
JohnG -- 这是使用正确的库,但不是原生支持的。如果你指的是.Split(','),那远远不能保证完全正确。如果你指的是Visual Basic解析器,那它并不是真正按行读取(在引号括起来的CSV字段中可能会有换行符等)。 - undefined
https://github.com/Cinchoo/ChoETL 运行良好。 - undefined
CSVHelper绝对是首选... https://joshclose.github.io/CsvHelper/ ... 别浪费时间在其他东西上。 - undefined
你有Excel互操作吗?用这种方式读取CSV文件非常容易。 - undefined
4个回答

0

你能检查一下下面的代码吗?这对你会有帮助。

 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


0
你可以使用 CSVHelper 来避免手动编写 CVS 解析器。

这并没有回答问题。一旦您获得足够的声望,您将能够在任何帖子上发表评论;相反,提供不需要提问者澄清的答案。- 来自审查 - undefined

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;
/*
        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中,并将grid的数据源设置为Datatable。这是一个ASP.NET WebForm代码。

你有在哪里将这些行添加到列表中吗?我对C#还比较新。 - undefined
是的,我已经注释掉了那部分代码。只需复制所有的代码。 - undefined
好的,我以为这只会循环遍历接收者列表中已经存在的内容。 - undefined
这是我的代码的一部分。你可以创建自己的类。 - undefined

0
假设你的是一个读取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/


ExcelDataReader 实际上可以处理 CSV 文件。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接