从超大html表单提取标题和input的属性,以及在input特定属性前插入内容
- 编程时遇到需要从超大html表单(标题和input成对)中提取“标题和input中的ref值”,以及在input特定属性前插入内容,特写下面两个方法,避免重复劳动。
static void Main(string[] args)
{
ReadTxt();
InsertText();
}
/// <summary>
/// html页面有一个很大表单(标题和input成对),本方法实现:提取标题和input的ref属性放到List集合中,并转成可贴到Excel格式
/// 【实现思路】 分析html源码,找规律,然后不断替换,直到数据清洗干净,可以轻松通过截取得到想要的值。
/// </summary>
/// <param name="Path">文件地址</param>
public static void ReadTxt()
{
string Path = @"D:\DiagnosisInfo.html";
StreamReader sr = new StreamReader(Path, Encoding.UTF8);
string content;
List<string> list = new List<string>();
string[] pair = new string[2];
while ((content = sr.ReadLine()) != null)
{
string line = content.ToString()
.Replace("\"", "")
.Replace("'", "")
.Replace(">", "")
.Replace(" style=width: 80px", "")
.Replace(" style=", "\t")
.Replace(" :disabled", "\t")
.Replace(" width", "\t")
.Replace(" size=small", "");
if (line.IndexOf("<el-form-item") >= 0)
{
string[] ar = line.Replace("label=", "@").Split('@');
string title = ar.Length >= 2 ? ar[1] : "";
pair[0] = title;
}
else if (line.IndexOf("ref=") >= 0)
{
string model = line.Replace("ref=", "@").Split('@')[1];
pair[1] = model;
}
if (!string.IsNullOrWhiteSpace(pair[0]) && !string.IsNullOrWhiteSpace(pair[1]))
{
list.Add(pair[0] + "\t" + pair[1]);
pair[0] = "";
pair[1] = "";
}
}
string result = string.Join("\r\n", list);
}
/// <summary>
/// html有一个很大表单(标题和input成对),本方法实现:在input控件的“ref='控件id'”属性前面加上“ @keyup.native="JumpFocus('控件id')"”(其中“控件id”取自ref值)
/// 【思路】 分析html源码,找规律,然后用正则表达式取得各input的ref值,然后通过增量替换方式置换成自己想要的样子。
/// </summary>
private static void InsertText()
{
string Path = @"D:\ DiagnosisInfo.html";
StreamReader sr = new StreamReader(Path, Encoding.UTF8);
string content;
List<string> list = new List<string>();
while ((content = sr.ReadLine()) != null)
{
string line = content.ToString();
if (line.IndexOf("ref=") >= 0)
{
string start = "ref='";
string end = "'";
Regex rgx = new Regex("(?<=(" + start + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);//截取“ref='”和“'”之间的值
string tmp = rgx.Match(line).Value;//控件id
line = line.Replace("ref=", " @keyup.native=\"JumpFocus('"+tmp+"')\" ref=");
}
list.Add(line);
}
string result = string.Join("",list);
}
总结
- html或C#等编码时出现大量重复性拼接工作时,就要考虑下是否可以批量化或自动化操作。可以一类一类地操作;也可以是一列一列地操作;或借助C#强大的替换、截取、正则表达式等进行逻辑控制的自动化地操作。
- 手头提高效率的工具有notepad++和Excel,手机QQ浏览器实用功能:翻译,图片或纸上文字转文本,搜图。搜狗输入法:图片转文字。
- notepad++常见批量操作:把文本按规律转多列放到Excel、多行列选中、多行转一行、一行转多列、多类批量替换、同类着色或计数等。
- Excel:对列进行首尾加入同类字符或字数+1的字符,一列一列方式批量操作,两个单元格内容比较等
- 实战举例:编码时有大量数据库字段形如out_prof_on,怎么批量转为outProfOn(骆驼命名法)?
- 步骤:下划线替换为“tab”键
→
贴到Excel→
copy一列到notepad++中shift+alt+选择
列选中方式选中首字母→
转大写(shift+ctrl+u
)→
贴回Excel替换其所在列, 如此反复操作其他列, 最后在notepad++中去掉所有“tab”键即可。
- 自己体会的高效编码的几个层次:
工具化
:借助成熟的框架或代码生成工具,生成代码。自动化
:按类别或规律自己写一些简单实用的代码生成工具(可以是一个函数或一个控制台程序,多年沉淀后此类工作应该会越做越少),生成代码。批量化
:借助notepad++或Excel等工具一次性或分类批量化,操作代码。体力化
:最低等级,就是进行重复的体力劳动(智力不行体力补)。