如何实现从字符串中提取需要的字符并赋值给指定单元格内是本软件设计的理由和核心需求和要做的事情,工作原理很简单:读取原地址字符串从中找到指定字符,填充到指定单元格内形成十级分类,同时删除原字符串内已找到的字符,依十级字符从第一级依次执行。
上代码和分析,这一步逻辑处理较多,代码如下:其实软件设计就是把思维细化写为语句,如:怎么知道某字符属于哪级,脑中必然有预存数据提出作比较,因此,给软件设计一个存储指定各级字符,上次发布界面右上控件为处理结果、右下控件为条件设定。
private void 提取数据自动处理(int 总数据量)
{
定位 = 处理结果.CurrentCellAddress.Y;
this.Invoke(new Action(delegate()
{
string 字符 = "", 条件字符 = "", 等效字符 = "0123456789-—_一二三四五六七八九十百千万亿0123456789零壹贰叁肆伍陆柒捌玖";
for (int 总行 = 0; 总行 < 总数据量; 总行++)/*循环已读取地址字符串总数据量,数值将在快捷菜单中传递,稍后发布如何创建快捷菜单进行人机交互操作,本软件没任何按钮*/
{
字符 = 处理结果.Rows[总行].Cells[11].Value.ToString();/*从控件读取原导入地址字符串*/
处理结果.Invoke(new Action(delegate() { 处理结果.CurrentCell = 处理结果.Rows[总行].Cells[处理结果.CurrentCellAddress.X]; }));/*同时使控件随读取行数定位选中单元格而滚动让人知道程序工作进度*/
for (int 列 = 0, 量 = 条件设定.ColumnCount - 1; 列 < 量; 列++)/*从列开始依次执行*/
{
bool 全无 = false;
for (int 行 = 0, 数 = 条件设定.RowCount - 1; 行 < 数; 行++)/*各列的行依次执行*/
{
条件字符 = 条件设定.Rows[行].Cells[列].Value.ToString();
if (条件字符 == "") continue;/*由于各列存储条件设定字符数量不同,又采取了自动去重复和按降序排序技术,所以,当循环列中各行时,对存储量少的执行这个处理*/
if (条件字符 == "/") 处理结果.Rows[总行].Cells[列 + 1].Value = "/";
if (列 == 8)/*对这列执行特别处理,从剩余字符串中提取数值字符,另加指定字符如:号、#、楼、室、层、幢、栋......*/
{
if (字符.Length > 0)
{/*呵呵,由于急着使用这里没做优化,[等效提取]这个就是回复友人评论说的另有妙用所在*/
if (等效提取(字符, 等效字符) == "") 处理结果.Rows[总行].Cells[列 + 1].Value = "/";
else 处理结果.Rows[总行].Cells[列 + 1].Value = 等效提取(字符, 等效字符) + 条件字符;
}
else 处理结果.Rows[总行].Cells[列 + 1].Value = "/";
}
else
{/*这里处理提取数值,在条件设定中使用特定提取字符如:?组、?队;如字符串中存在某村某组、某队*/
if (条件字符.Contains("?") || 条件字符.Contains("?"))
{
string 特殊处理 = 条件字符.Replace("?", "").Replace("?", "");
if (字符.Contains(特殊处理))
{/*可优化,如果语句出现重复则可归纳进行优化,尤其是影响效率的函数执行或操作控件*/
处理结果.Rows[总行].Cells[列 + 1].Value = 处理结果.Rows[总行].Cells[列 + 1].Value.ToString().Replace("/", "") + 等效提取(字符.Substring(0, 字符.IndexOf(特殊处理) + 特殊处理.Length), 等效字符 + 特殊处理);
字符 = 字符.Substring(字符.IndexOf(特殊处理) + 特殊处理.Length); 全无 = true;
}
}
if (字符.Contains(条件字符))/*常规提取处理*/
{/*可优化*/
if (处理结果.Rows[总行].Cells[列 + 1].Value.ToString().Replace("/", "") != 条件字符)
处理结果.Rows[总行].Cells[列 + 1].Value = 处理结果.Rows[总行].Cells[列 + 1].Value.ToString().Replace("/", "") + 条件字符;
字符 = 字符.Substring(字符.IndexOf(条件字符) + 条件字符.Length); 全无 = true;
}
if (!全无) 处理结果.Rows[总行].Cells[列 + 1].Value = "/";
}
}
}
if(总行 == 总数据量 - 1) MessageBox.Show("提取数据完成!" + 总数据量.ToString() + "行数据。", "友情提示!");
}
主体快捷菜单.Items[5].Enabled = true;
处理结果.Invoke(new Action(delegate() { 处理结果.CurrentCell = 处理结果.Rows[定位].Cells[处理结果.CurrentCellAddress.X]; }));/*特别是如果第二次执行时,定位上次查看或处理选中的所在行和列,使软件使用人接着上次处理工作*/
}));
}
以上分析直接注视在代码中了,就不再赘述,有兴趣的自己整理;提取字符是很繁琐的事情,有时遇到情况比较复杂,尤其是对不规范书写情况以上代码改之又改,以上代码直接从控件操作处理。
下面代码之所以一直保存,就是妙用所在:
public string 等效提取(string 转换内容, string 指定内容)
{
string 等效 = "";
try
{
for (int 字符 = 0; 字符 < 转换内容.Length; 字符++)
{
int 位置 = 指定内容.IndexOf(转换内容.Substring(字符, 1));
if (位置 >= 0) 等效 += 指定内容.Substring(位置, 1);
转换内容 = 转换内容.Replace("--", "-").Replace("—", "-").Replace("——", "-").Replace("_", "-");
}
}
catch (Exception Ts)
{ 等效 = "浤济类.内容等效:非法->" + Ts.ToString(); }
return 等效;
}
下次发布:如何创建快捷菜单执行人机交互操作。由于软件急用设计,没考虑界面布局细节,况现在创建快捷菜单轻而易举。