C# CSV 文件读取的三种方式分析

1 、文件流 + 字符串分割(","),缺点:数据中如果有",",会出现分割错误。

复制代码
public DataTable readCsvSql(string filepath)
{
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("gb2312"));
    //记录每次读取的一行记录
    string strLine = null;
    //记录每行记录中的各字段内容
    string[] arrayLine = null;
    //分隔符
    string[] separators = { ",","\t"};
    //逐行读取CSV文件
    while ((strLine = sr.ReadLine()) != null)
    {
         //去除头尾空格
          strLine = strLine.Trim();
          //分隔字符串,返回数组
          arrayLine = strLine.Split(separators, StringSplitOptions.RemoveEmptyEntries);

          // arrayLine  就是需要的数据
    }
}

2、 读取数据库表方式

缺点:不同系统上的 Provider 值不一样,没法大面积使用 (Provider=Microsoft.Jet.OLEDB.4.0; 这个在win7上可行,网上说win11有问题)

复制代码
 public DataTable readCsvSql(string filepath)
        {
            DataTable dt = new DataTable();
            try
            {
                string directory = Path.GetDirectoryName(filepath);
                string file = Path.GetFileName(filepath);

                if (file.Trim().ToUpper().EndsWith("CSV"))//判断所要读取的扩展名
                {
                    string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + directory + ";Extended Properties='text;HDR=NO;FMT=Delimited'";//有列的读取
                    string commandText = "select * from [" + file + "]";//SQL语句
                    OleDbConnection olconn = new OleDbConnection(connStr);
                    olconn.Open();
                    OleDbDataAdapter odp = new OleDbDataAdapter(commandText, olconn);
                    odp.Fill(dt);
                    olconn.Close();
                    odp.Dispose();
                    olconn.Dispose();
                }
                else
                {
                    //  异常处理
                }
            }
            catch (Exception ex)
            {
                //  异常处理
            }

            return dt;
        }
  1. 使用 FileIO.TextFieldParser读取, 我现在就采用这个方法,暂时没发现问题 。

    复制代码
         private void ReadCSVFile(string strCsvFilePath)
         {
             using (Microsoft.VisualBasic.FileIO.TextFieldParser csvReader = new Microsoft.VisualBasic.FileIO.TextFieldParser(strCsvFilePath, Encoding.GetEncoding("gb2312")))
             {
                 csvReader.SetDelimiters(new string[] { "," });
                 csvReader.HasFieldsEnclosedInQuotes = true;
                  跳过标题行(如果有)
                 //csvReader.ReadLine();
    
                 while (!csvReader.EndOfData)
                 {
                     string[] arrayLine = csvReader.ReadFields();                
                     // arrayLine 中就是每行的数据
    
                 }  
             }
         }
相关推荐
烤麻辣烫12 分钟前
黑马程序员苍穹外卖(新手)DAY6
java·开发语言·学习·spring·intellij-idea
友友马39 分钟前
『QT』窗口 (一)
开发语言·数据库·qt
APIshop43 分钟前
Python 零基础写爬虫:一步步抓取商品详情(超细详解)
开发语言·爬虫·python
AI科技星1 小时前
为什么宇宙无限大?
开发语言·数据结构·经验分享·线性代数·算法
Appreciate(欣赏)2 小时前
JAVA使用poi类读取xlxs文件内容拼接成添加数据SQL
java·开发语言·sql
oioihoii2 小时前
性能提升11.4%!C++ Vector的reserve()方法让我大吃一惊
开发语言·c++
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于JAVA的恒星酒店客房管理系统为例,包含答辩的问题和答案
java·开发语言
思密吗喽2 小时前
景区行李寄存管理系统
java·开发语言·spring boot·毕业设计·课程设计
Rust语言中文社区2 小时前
【Rust日报】Dioxus 用起来有趣吗?
开发语言·后端·rust
小灰灰搞电子2 小时前
Rust Slint实现颜色选择器源码分享
开发语言·后端·rust