⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmcsvconvert.cs

📁 在设计程序时,需要经常计算一个字串的哈希值,得到加密文本,生成加密过的配置文件或都转换EXCEL文件到SQL数据库等等,根据自己习惯定制部分功能,由于时间关系,没有详细说明
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace LingangTools
{
    public partial class FrmCsvConvert : Form
    {
        public FrmCsvConvert()
        {
            InitializeComponent();
        }

        private string fileName;
        private DataSet csvData;
        private void btn_OpenCsvFile_Click(object sender, EventArgs e)
        {
            if (ofg_CsvFile.ShowDialog() == DialogResult.OK)
            {
                fileName = ofg_CsvFile.FileName;
                Text = string.Format("CSV文件转换:{0}",fileName);
                if (File.Exists(fileName))
                {
                    FileStream fs = new FileStream(fileName,FileMode.Open);
                   
                    byte[] csvBytes = new byte[fs.Length];
                    fs.Read(csvBytes, 0, (int)fs.Length);
                    string csvText = Encoding.Default.GetString(csvBytes);
                    System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(System.Environment.NewLine);
                    string [] csvLines = regex.Split(csvText);
                    if (csvLines.Length == 0)
                        return;
                    string[] columnsName,line;
                    try
                    {
                        string strLine = csvLines[0];
                        if (chk_FirstRowAsColumnName.Checked)
                        {
                            columnsName = CsvFormatParse(strLine);
                            csvData = NewDataSet(columnsName);
                        }
                        else
                        {
                            line = CsvFormatParse(strLine);
                            columnsName = new string[line.Length];
                            for (int i=0; i < columnsName.Length; i++)
                                columnsName[i] = string.Format("列{0}", i);
                            csvData = NewDataSet(columnsName);
                            AddDataToDataSet(line);
                        }
                        dataGridView_DataGrid.DataSource = csvData;
                        dataGridView_DataGrid.DataMember = "原始数据表";
                        for(int j=1;j<csvLines.Length;j++)
                        {
                            string[] s = CsvFormatParse(csvLines[j]);
                            if(s!=null)
                                AddDataToDataSet(s);
                        }
                        btn_GenSqlCode.Enabled = true;
                        btn_SaveAsXml.Enabled = true;
                        btn_SetColumns.Enabled = true;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    finally
                    {
                         fs.Close();
                    }
                }
            }
        }

        private string[] CsvFormatParse(string line)
        {
            if (line == string.Empty)
                return null;
            string [] s = line.Split(',');
            string [] result = new string[s.Length];
            int rank = 0;
            for (int i = 0; i < s.Length; i++)
            {//遍历用引号分隔开的字符串数组
                int yhRank = YhCountRank(s[i]);
                if (yhRank==0)
                {//如果遇到引号个数不为零且为偶数的情况
                    result[rank] = TrimYh(s[i], true);
                    rank++;
                }
                else if (yhRank == -1)
                {//如果遇到引号个数为零
                    result[rank] = s[i];
                    rank++;//秩加1
                }
                else
                {//引号个数为奇数时
                    StringBuilder sb = new StringBuilder();
                    sb.Append(TrimYh(s[i],false));
                    bool formatError = true;
                    //寻找下个引号个数为奇数的索引
                    int yh;
                    for (yh = (i+1); yh < s.Length; yh++)
                    {
                        if (YhCountRank(s[yh])==1)
                        {//找到则跳出循环
                            formatError = false;
                            break;
                        }
                    }
                    //如无法找以配对,则抛出异常
                    if (formatError)
                        throw new Exception("CSV文件格式错误,找不到配对引号");
                    for (int j = (i + 1); j < yh; j++)
                    {//将2个配对之间的字符串合并
                        i++;
                        if (YhCountRank(s[j]) == -1)
                            sb.Append(',').Append(s[j]);
                        else
                            sb.Append(',').Append(s[j].Replace("\"\"", "\""));
                    }
                    i++;
                    //将配对的引号个数为奇数的字符串合并
                    sb.Append(',').Append(TrimYh(s[yh],false));
                    result[rank] = sb.ToString();//记当合并结果
                    rank++;//秩加1
                }
            }
            string[] resultOk = new string[rank];
            for (int i = 0; i < rank; i++)
                resultOk[i] = result[i];
            return resultOk;
        }

        private int YhCountRank(string s)
        {//判断字符串中引号个数是不是为偶数
            int yhConut = 0;
            foreach (char c in s)
            {
                if (c == '"')
                    yhConut++;
            }
            if (yhConut == 0)
                return -1;
            return yhConut % 2;
        }//YH是引号的意思

        private string TrimYh(string s,bool includeLast)
        {//去除引号
            if (includeLast)
                return s.Substring(1, s.Length - 2).Replace("\"\"", "\"");
            else if(s[0]=='"')
                return s.Substring(1, s.Length - 1).Replace("\"\"", "\"");
            else
                return s.Substring(0, s.Length - 1).Replace("\"\"", "\"");
        }

        private DataSet NewDataSet(string [] columnsName)
        {
            DataSet ds = new DataSet();
            DataTable table = new DataTable("原始数据表");
            foreach (string s in columnsName)
            {
                table.Columns.Add(s, typeof(string));
            }
            ds.Tables.Add(table);
            return ds;
        }

        private void AddDataToDataSet(string [] line)
        {
             DataTable table = csvData.Tables["原始数据表"];
            if (line.Length != table.Columns.Count)
            {
                throw new Exception("CSV数据格式不正确,每行长度不一");
            }

            DataRow dr = table.NewRow();
            int i = 0;
            foreach (string s in line)
            {
                dr[i] = s;
                i++;
            }
            table.Rows.Add(dr);
        }

        private void btn_SetColumns_Click(object sender, EventArgs e)
        {
            FrmCsvConvertSetColumn frm = new FrmCsvConvertSetColumn();
            frm.Data = csvData;
            frm.ShowDialog();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -