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# 中是不是有任何 CSV 读取器/写入器库? [关闭]

在 C# winforms 中读取 csv 文件时出现数据错误

仅从csv文件c#中读取特定列[重复]

自用 .net C# CSV文件写入读取工具类

我正在尝试从 .csv 读取信息并将其放入 C# 中的数组中。谁能告诉我为啥代码不起作用?

同时读取几个.csv文件[重复]