📄 frmcsvconvert.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 + -