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;}
3. 使用 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 中就是每行的数据} }}