I recived alarms in a form of text as the following
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 .
I need to fill it in csv file so later I can perform some analysis
I came up with this
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);
the results are as I want except when I reach the part of
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 .
I couldnt split them into seperate fields.
as the results showing is as

I want to split the details I want each element in details to be in a column
to be somthin like

its realy annoying :-)
please help , thank you in advance
Split using this regex expression
string[] values = Regex.Split(line,
@",?\s*\w+(\sNo\.|\sType|\sName)?=",
RegexOptions.ExplicitCapture);
It should split the whole line at once. The only thing it cannot do, is to remove the " ." at the end of the line and it will also yield some unwanted entries that you will have to remove (I marked them with a minus sign). This is what I get as result:
[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 ."
--
Let me explain the Regex expression ,?\s*\w+(\sNo\.|\sType|\sName)?=
,? an optional comma
\s*\w+ a word possibly preceded by spaces
(\sNo\.|\sType|\sName)? optionally a " No." or a " Type" or a " Name"
= an equal sign
UPDATE
The full code looks like this
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);
RegexOptions.ExplicitCapture. Regex includes matches parts in the parentheses (captues) in the result otherwise - Olivier Jacot-Descombes 2012-04-06 00:55
After this line:
string v = token.Remove(0, values[0].Length + 1 + values[1].Length + 1).Replace(',', ';')
Do:
var detailParts = v.Split(";".ToCharArray());
Now fill the detail parts. and append them to sb, for filling detail parts you need do something like this.
detailPart[i].Split("=".ToCharArrray())[1]