C#读取Excel导出的CSV文件

作者: Pieces_Jing | 来源:发表于2019-04-13 16:11 被阅读0次

有时候我们在项目中需要填写一些配置,通常来说用excel会比较方便。那么这些数据在直接放到项目中使用的时候,可以通过导出csv文件来使用。这里便是一个自己封装的读取csv文件的代码。对特殊字符已经进行了识别,兼容。

完整代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Jing
{
    public class CSVFile
    {
        List<string[]> _data = new List<string[]>();

        /// <summary>
        /// 数据
        /// </summary>
        public string[][] Data
        {
            get { return _data.ToArray(); }
        }

        int _rowCount = 0;

        /// <summary>
        /// 行数
        /// </summary>
        public int RowCount
        {
            get { return _rowCount; }
        }

        int _colCount = 0;

        /// <summary>
        /// 列数
        /// </summary>
        public int ColCount
        {
            get { return _colCount; }
        }

        /// <summary>
        /// 通过数据生成
        /// </summary>
        /// <param name="data"></param>
        public CSVFile(byte[] data, Encoding encoding)
        {            
            var content = encoding.GetString(data);
            string[] rows = content.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            ParseRows(rows);
        }

        public CSVFile(string path)
        {
            System.Text.Encoding encoding = GetEncoding(path);
            string[] rows = File.ReadAllLines(path, encoding);
            ParseRows(rows);
        }       
        
        void ParseRows(string[] rows)
        {
            for (int i = 0; i < rows.Length; i++)
            {
                var cols = GetCols(rows[i]);
                if (null != cols)
                {
                    _data.Add(cols.ToArray());
                }
            }

            _rowCount = _data.Count;
            if (_rowCount > 0)
            {
                _colCount = _data[0].Length;
            }
        }

        /// <summary>
        /// 得到表格的值
        /// </summary>
        /// <param name="row"></param>
        /// <param name="col"></param>
        public string GetValue(int row, int col)
        {
            return _data[row][col];
        }

        /// <summary>
        /// 分割一行字符串中的列
        /// </summary>
        /// <param name="rowContent"></param>
        /// <returns></returns>
        List<string> GetCols(string rowContent)
        {
            //引号
            const char QUOTATION_MARKS = '"';
            //逗号
            const char COMMA = ',';

            List<string> cols = new List<string>();
            //分割标记(同时也是一列字符串的第一个字符的索引)
            int splitMark = 0;
            int charIdx = 0;
            bool isSpecial = false;
            while (charIdx < rowContent.Length)
            {
                char c = rowContent[charIdx];
                int nextIdx = charIdx + 1;

                if (charIdx == splitMark)
                {                    
                    if (c == QUOTATION_MARKS)
                    {
                        isSpecial = true;                        
                    }
                    else
                    {
                        isSpecial = false;
                        if(nextIdx == rowContent.Length)
                        {
                            //结束符
                            string colContent = rowContent.Substring(splitMark);
                            cols.Add(colContent);
                            break;
                        }
                    }
                }
                else
                {
                    if(isSpecial)
                    {
                        //处理含有特殊字符串的内容
                        if (c == QUOTATION_MARKS)
                        {                            
                            if (nextIdx == rowContent.Length)
                            {
                                //结束符
                                string colContent = rowContent.Substring(splitMark + 1, charIdx - splitMark - 1);
                                colContent = colContent.Replace("\"\"", "\"");
                                cols.Add(colContent);                                
                                //跳过下一个引号
                                charIdx++;
                            }
                            else
                            {
                                char nextC = rowContent[nextIdx];
                                if(nextC == QUOTATION_MARKS)
                                {
                                    //跳过双引号
                                    charIdx++;
                                }
                                else if(nextC == COMMA)
                                {
                                    //分割符
                                    string colContent = rowContent.Substring(splitMark + 1, charIdx - splitMark - 1);
                                    colContent = colContent.Replace("\"\"", "\"");
                                    cols.Add(colContent);
                                    charIdx++;
                                    splitMark = nextIdx + 1;
                                }
                            }
                        }
                    }
                    else
                    {
                        //处理普通字符串的内容
                        if(c == COMMA)
                        {
                            //分割符
                            string colContent = rowContent.Substring(splitMark, charIdx - splitMark);
                            cols.Add(colContent);
                            splitMark = charIdx + 1;                            
                        }

                        if (nextIdx == rowContent.Length)
                        {
                            //结束符
                            string colContent = rowContent.Substring(splitMark);
                            cols.Add(colContent);
                            break;
                        }
                    }
                }

                charIdx++;
            }

            return cols;
        }

        System.Text.Encoding GetEncoding(string FILE_NAME)
        {
            FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
            System.Text.Encoding r = GetEncoding(fs);
            fs.Close();
            return r;
        }


        System.Text.Encoding GetEncoding(FileStream fs)
        {
            BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
            byte[] ss = r.ReadBytes(3);
            r.Close();
            //编码类型 Coding=编码类型.ASCII;   
            if (ss[0] >= 0xEF)
            {
                if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)
                {
                    return System.Text.Encoding.UTF8;
                }
                else if (ss[0] == 0xFE && ss[1] == 0xFF)
                {
                    return System.Text.Encoding.BigEndianUnicode;
                }
                else if (ss[0] == 0xFF && ss[1] == 0xFE)
                {
                    return System.Text.Encoding.Unicode;
                }
                else
                {
                    return System.Text.Encoding.Default;
                }
            }
            else
            {
                return System.Text.Encoding.Default;
            }
        }
    }
}

相关文章

  • Golang使用CSV读取、导出文件

    导出csv文件 读取csv

  • C#读取Excel导出的CSV文件

    有时候我们在项目中需要填写一些配置,通常来说用excel会比较方便。那么这些数据在直接放到项目中使用的时候,可以通...

  • Pandas学习小结【2】解析CSV文件

    Pandas可以读取多种类型文件,如excel, txt, csv等, 这里小结下读取csv文件。 读取CSV文件...

  • R数据读写

    csv文件读写 txt文件读写 读取excel文件 转成csv文件读取(逗号分隔) 专程prn文件读取(空格分隔)...

  • 利用Python处理Excel数据

    读取数据 读取x.xlsx文件 读取文件夹 读取txt文件 读取csv格式Excel表 写入excel 显示数据 ...

  • Python pandas数据分析中常用方法

    读取写入文件 官方IO 读取 写入 read_csv to_csv read_excel to_excel rea...

  • R数据导入之XLSX

    最好的读取Excel文件的方式: 在Excel中将其导出为一个逗号分隔符文件(csv),并使用前文“R数据导入之C...

  • DataGrip 导入 Excel 数据

    目前DataGrip不支持导入Excel,可以将Excel导出为csv文件进行导入:文件=>导出=》更改文件类型=...

  • pandas导入导出&合并

    一、导出与导入: pandas可以读取很多类型的文件,类似csv.excel等,详情可以查看官方说明文本 导入文件...

  • zabbix导出的CSV文件乱码

    现象: 导出数据到csv文件后,用excel打开该导出csv文件显示的是乱码。 处理过程: 这个问题是 csv 文...

网友评论

    本文标题:C#读取Excel导出的CSV文件

    本文链接:https://www.haomeiwen.com/subject/ddcrwqtx.html