文章评分
次,平均分 :
关于 CSV 文件
CSV,全称Comma-Separated Values,即逗号分隔值(或字符分隔值),它是一种以逗号等符号间隔的数据文件格式,可用于存放不带公式和格式的电子表格。CSV文件可以使用Excel软件打开和编辑。因为CSV文件的本质是TXT文件,因此可以使用《C#:读写TXT文件》一文介绍的方法对其进行读写操作。
之所以介绍CSV文件,是因为目前要在C#中输出Excel文件(xls、xlsx)是一件比较麻烦的事。相比之下,CSV文件输出操作简单,输出行数无限制(xls格式最大65,536行,xlsx格式最大1,048,576行),且可以使用Excel打开。
写 CSV 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public static void SaveCSV(DataTable dt, string fullPath) { FileInfo fi = new FileInfo(fullPath); if (!fi.Directory.Exists) { fi.Directory.Create(); } FileStream fs = new FileStream(fullPath, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs, Encoding.Default); string data = string.Empty; //输出列名称 for (int i = 0; i < dt.Columns.Count; i++) { data += dt.Columns[i].ColumnName.ToString()+","; } data = data.Substring(0,data.Length-1); sw.WriteLine(data); //输出各行数据 for (int i = 0; i < dt.Rows.Count; i++) { data = ""; for (int j = 0; j < dt.Columns.Count; j++) { string str = dt.Rows[i][j].ToString(); str = str.Replace("\"", "\"\"");//替换英文引号 if (str.Contains(',') || str.Contains('"') || str.Contains('\r') || str.Contains('\n')) //含逗号、引号、换行符的需要放到引号中 { str = string.Format("\"{0}\"", str); } data += str; if (j < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); } sw.Close(); fs.Close(); } |
读 CSV 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public static DataTable ReadCSV(string filePath) { DataTable dt = new DataTable(); FileStream fs = new FileStream(filePath, FileMode.Open,FileAccess.Read); StreamReader sr = new StreamReader(fs, Encoding.Default); //记录每次读取的一行记录 string strLine = string.Empty; //记录每行记录中的各字段内容 string[] aryLine = null; string[] tableHead = null; //标示列数 int columnCount = 0; //标示是否是读取的第一行 bool IsFirst = true; //逐行读取CSV中的数据 while ((strLine = sr.ReadLine()) != null) { if (IsFirst == true) { tableHead = strLine.Split(','); IsFirst = false; columnCount = tableHead.Length; //创建列 for (int i = 0; i < columnCount; i++) { DataColumn dc = new DataColumn(tableHead[i]); dt.Columns.Add(dc); } } else { aryLine = strLine.Split(','); DataRow dr = dt.NewRow(); for (int j = 0; j < columnCount; j++) { dr[j] = aryLine[j]; } dt.Rows.Add(dr); } } sr.Close(); fs.Close(); return dt; } |
注意事项
在函数 SaveCSV() 中,由于考虑了单引号、逗号部分特殊符号量的输出,因此流程与纯文本的输出稍有差异。具体来说,如果某单元格的原始数据为 Hi,test"14",在写 CSV 文件时应输出为 "Hi,test""14""",这样才能确保在 Excel 中有正确的显示。
鉴于符号组合的复杂性,在函数 ReadCSV() 中,并没有考虑特殊符号。因此,ReadCSV() 仅适合读入简单的逗号分隔文件,这是本文提供的读 CSV 文件的方法的局限所在。
除特别注明外,本站所有文章均为交通人原创,转载请注明出处来自http://www.hijtr.com/csharp-csv/
暂无评论