我以文字的形式收到警报,如下所示
NE=JKHGDUWJ3 Alarm=Data Center STALZ AC Failure Occurrence=2012/4/3 22:18:19 GMT+02:00 Clearance=Details=Cabinet No.=0, Subrack No.=40, Slot No.=0, Port No.=5, Board Type=EDS, Site No.=49, Site Type=HSJYG500 GSM, Site Name=Google1 .
我需要在csv文件中填写它,以便稍后我可以执行一些分析
我想出了这个
if (!File.Exists(filesName)) {
string header = "NE,Alarm,Occurrence,Clearance,Details";
File.AppendAllText(filesName,header+Environment.NewLine);
}
StringBuilder sb = new StringBuilder();
string line = textBoxAlarm.Text;
int index = line.IndexOf(" ");
while (index > 0) {
string token = line.Substring(0, index).Trim();
line = line.Remove(0, index + 2);
string[] values = token.Split('=');
if (values.Length ==2) {
sb.Append(values[1] + ",");
} else {
if (values.Length % 2 == 0) {
string v = token
.Remove(0, values[0].Length + 1)
.Replace(',', ';');
sb.Append(v + ",");
} else {
sb.Append("********" + ",");
string v = token
.Remove(0, values[0].Length + 1 + values[1].Length + 1)
.Replace(',', ';');
sb.Append(v + ",");
}
}
index = line.IndexOf(" ");
}
File.AppendAllText(filesName, sb.ToString() + Environment.NewLine);
结果是我想要的,除非我到达
的部分Details=Cabinet No.=0, Subrack No.=40, Slot No.=0,
Port No.=5, Board Type=KDL, Site No.=49, Site Type=JDKJH99 GSM, Site Name=Google1 .
我无法将它们分成单独的区域。
显示的结果为
我想将详细信息分成我希望每个元素的详细信息都在列
中像somthin一样
真的很讨厌: - )
请帮助,提前谢谢
答案 0 :(得分:2)
这一行之后:
string v = token.Remove(0, values[0].Length + 1 + values[1].Length + 1).Replace(',', ';')
执行:
var detailParts = v.Split(";".ToCharArray());
现在填写详细信息部分。并将它们附加到sb
,以填充您需要的详细信息。
detailPart[i].Split("=".ToCharArrray())[1]
答案 1 :(得分:1)
使用此正则表达式分割
string[] values = Regex.Split(line,
@",?\s*\w+(\sNo\.|\sType|\sName)?=",
RegexOptions.ExplicitCapture);
它应该立刻拆分整条线。它唯一不能做的就是删除“。”在行尾,它也会产生一些不需要的条目 你将不得不删除(我用减号标记)。这就是我得到的结果:
[0]-: "" [1] : "JKHGDUWJ3" [2] : "Data Center STALZ AC Failure" [3] : "2012/4/3 22:18:19 GMT+02:00" [4] : "" [5]-: "" [6] : "0" [7] : "40" [8] : "0" [9] : "5" [10] : "EDS" [11] : "49" [12] : "HSJYG500 GSM" [13] : "Google1 ."
-
让我解释正则表达式,?\s*\w+(\sNo\.|\sType|\sName)?=
,?
可选的逗号
\s*\w+
一个字可能以空格开头
(\sNo\.|\sType|\sName)?
可选" No."
或" Type"
或" Name"
=
等号
<强>更新强>
完整代码如下所示
if (!File.Exists(filesName)) {
string header = "NE,Alarm,Occurrence,Clearance,CabinetNo,SubrackNo,SlotNo,PortNo,BoardType,SiteNo,SiteType,SiteName";
File.AppendAllText(filesName, header + Environment.NewLine);
}
string line = textBoxAlarm.Text.TrimEnd(' ', '.');
string[] values = Regex.Split(line, @",?\s*\w+(\sNo\.|\sType|\sName)?=",
RegexOptions.ExplicitCapture);
List<string> valuesList = values.ToList();
valuesList.RemoveAt(5); // Remove the empty Details part.
valuesList.RemoveAt(0); // Remove the first empty part.
values = valuesList
.Select(s => s == "" ? "********" : s)
.ToArray();
File.AppendAllText(filesName, String.Join(",", values) + Environment.NewLine);