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

Posted 你好创造者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自用 .net C# CSV文件写入读取工具类相关的知识,希望对你有一定的参考价值。

using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace AddrList.Common

    public class CsvHelper
    
        /// <summary>
        /// 写入CSV
        /// </summary>
        /// <param name="fileName">文件路径</param>
        /// <param name="dt">要写入的内存表</param>
        /// <returns>是否写入成功</returns>
        public static bool WriteCSV(string fileName, DataTable dt)
        
            FileStream fs = null;
            StreamWriter sw = null;

            try
            
                if (File.Exists(fileName)) File.Delete(fileName);

                fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
                sw = new StreamWriter(fs, Encoding.UTF8);

                sw.WriteLine(string.Join(",", dt.Columns.Cast<DataColumn>().Select(m => m.ColumnName)));

                for (int i = 0; i < dt.Rows.Count; i++)
                
                    sw.WriteLine(string.Join(",", dt.Rows[i].ItemArray.Select(m =>
                    
                        if (m is string && new Regex(@"^\\d+$").IsMatch(m.ToString().Trim()))
                        
                            m = $"\'m";
                        
                        //else if (m is DateTime time)
                        //
                        //    m = time.ToString("yyyy-MM-dd HH:mm:ss");
                        //

                        return m?.ToString();
                    )));
                
            
            catch
            
                return false;
            
            finally
            
                sw?.Close();
                fs?.Close();
            

            return true;
        

        /// <summary>
        /// 读取CSV文件
        /// </summary>
        /// <param name="fileName">文件路径</param>
        public static DataTable ReadCSV(string fileName)
        
            DataTable dt = new DataTable();

            FileStream fs = null;
            StreamReader sr = null;

            try
            
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                sr = new StreamReader(fs, Encoding.UTF8);

                //记录每次读取的行记录
                string strLine;

                //逐行读取
                while ((strLine = sr.ReadLine()?.Trim()) != null)
                
                    string[] arrLine = strLine.Split(new[]  \',\' );
                    if (dt.Columns.Count == 0) //表头
                    
                        dt.Columns.AddRange(arrLine.Select(m => new DataColumn(m)).ToArray());
                    
                    else //表内容
                    
                        DataRow dataRow = dt.NewRow();
                        dataRow.ItemArray = arrLine;

                        dt.Rows.Add(dataRow);
                    
                
            
            finally
            
                sr?.Close();
                fs?.Close();
            

            return dt;
        
    

  

java 读CSV 和 Excel

1、csv和excel读写对比 

开发中经常遇到数据导入和导出功能,csv 和 excel是最常见的数据格式,本文比较了下csv和excel读写相同数据的效率: 

测试数据格式一

用上面模板数据生成的测试:

耗时时间统计: 

测试数据格式二

生成数据:

耗时统计:

相同格式相同行数对比:

  • csv文件比excel文件稍大
  • csv读取/写入比excel快

csv文件读取工具类

excel文件读取工具类

工具类可以看出:csv读写是以行为单位来实现的;excel读取inputstream是直接加载到内存的。

如果用以上excel工具类读写一般需求都可以应付,如果遇到大量数据的读写,使用inputstream加载到内存的方式可能就会出现OOM问题。

2、excel大量数据写

excel工具类里处理了大量写的问题(SXSSFWorkbook分片对excel进行写入,上例中的100w测试数据就是这么写入的):

    /**
     * 创建一个Workbook
     * @param fileType
     * @return
     * @throws Exception
     */
    private static Workbook createWorkBook(String fileType) throws IOException {
        Workbook wb;
        if (excel2003L.equals(fileType)) {
            //2003-
            wb = new HSSFWorkbook();
        } else if (excel2007U.equals(fileType)) {
            //2007+  内存留存数据
            wb = new SXSSFWorkbook(10000);
        } else {
            throw new IOException("解析的文件格式有误!");
        }
        return wb;
    }

3、excel大量数据读 

大量数据读取直接使用workbook加载会出现OOM异常,一个好的办法是分批读取,参考:excel大量数据读取

以上是关于自用 .net C# CSV文件写入读取工具类的主要内容,如果未能解决你的问题,请参考以下文章

CSVFileUtil 读取写入CSV文件简单工具类

CSV文件转换帮助类

java能否读取csv文件的同时也写入数据?

java能否读取csv文件的同时也写入数据?

如何写入和读取 CSV 文件 - Oracle SQL Plus

java 读CSV 和 Excel