C#完美读取CSV
Posted 记性特差
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#完美读取CSV相关的知识,希望对你有一定的参考价值。
/// <summary> /// 将DataTable中数据写入到CSV文件中 /// </summary> /// <param name="dt">提供保存数据的DataTable</param> /// <param name="fileName">CSV的文件路径</param> public static bool SaveCSV(DataTable dt, string fullPath) { try { FileInfo fi = new FileInfo(fullPath); if (!fi.Directory.Exists) { fi.Directory.Create(); } FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write); //StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default); StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8); string data = ""; //写出列名称 for (int i = 0; i < dt.Columns.Count; i++) { data += "\"" + dt.Columns[i].ColumnName.ToString() + "\""; if (i < dt.Columns.Count - 1) { data += ","; } } 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 = string.Format("\"{0}\"", str); data += str; if (j < dt.Columns.Count - 1) { data += ","; } } sw.WriteLine(data); } sw.Close(); fs.Close(); return true; } catch { return false; } } /// <summary> /// 读取CSV文件到DataTable中 /// </summary> /// <param name="filePath">CSV的文件路径</param> /// <returns></returns> public static DataTable ReadCSV(string filePath) { DataTable dt = new DataTable(); int lineNumber = 0; using (CsvFileReader reader = new CsvFileReader(filePath)) { CsvRow row = new CsvRow(); while (reader.ReadRow(row)) { if (0 == lineNumber) { foreach (string s in row) { dt.Columns.Add(s.Replace("\"", "")); } } else { int index = 0; DataRow dr = dt.NewRow(); foreach (string s in row) { dr[index] = s.Replace("\"", ""); index++; } dt.Rows.Add(dr); } lineNumber++; } } return dt; }
public class CsvRow : List<string> { public string LineText { get; set; } } public class CsvFileReader : StreamReader { public CsvFileReader(Stream stream) : base(stream) { } public CsvFileReader(string filename) : base(filename) { } /// <summary> /// Reads a row of data from a CSV file /// </summary> /// <param name="row"></param> /// <returns></returns> public bool ReadRow(CsvRow row) { row.LineText = ReadLine(); if (String.IsNullOrEmpty(row.LineText)) return false; int pos = 0; int rows = 0; while (pos < row.LineText.Length) { string value; // Special handling for quoted field if (row.LineText[pos] == ‘"‘) { // Skip initial quote pos++; // Parse quoted value int start = pos; while (pos < row.LineText.Length) { // Test for quote character if (row.LineText[pos] == ‘"‘) { // Found one pos++; // If two quotes together, keep one // Otherwise, indicates end of value if (pos >= row.LineText.Length || row.LineText[pos] != ‘"‘) { pos--; break; } } pos++; } value = row.LineText.Substring(start, pos - start); value = value.Replace("\"\"", "\""); } else { // Parse unquoted value int start = pos; while (pos < row.LineText.Length && row.LineText[pos] != ‘,‘) pos++; value = row.LineText.Substring(start, pos - start); } // Add field to list if (rows < row.Count) row[rows] = value; else row.Add(value); rows++; // Eat up to and including next comma while (pos < row.LineText.Length && row.LineText[pos] != ‘,‘) pos++; if (pos < row.LineText.Length) pos++; } // Delete any unused items while (row.Count > rows) row.RemoveAt(rows); // Return true if any columns read return (row.Count > 0); } }
以上是关于C#完美读取CSV的主要内容,如果未能解决你的问题,请参考以下文章
在 C# winforms 中读取 csv 文件时出现数据错误