2

我收到了以下文本形式的警报

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 .

我无法将它们分成单独的字段。

结果显示为

示例结果

我想拆分详细信息我希望详细信息中的每个元素都在列中

变得像

在此处输入图像描述

它真的很烦人:-)

请帮忙,提前谢谢你

4

2 回答 2

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]
于 2012-04-05T23:37:38.873 回答
1

使用此正则表达式拆分

string[] values = Regex.Split(line,
                              @",?\s*\w+(\sNo\.|\sType|\sName)?=",
                              RegexOptions.ExplicitCapture);

它应该立即拆分整条线。它唯一不能做的就是删除“。” 在该行的末尾,它还会产生一些您必须删除的不需要的条目(我用减号标记它们)。这是我得到的结果:

    [0]-:“”  
    [1]:“JKHGDUWJ3”  
    [2]:“数据中心 STALZ AC 故障”  
    [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]:“谷歌1。”  

--

让我解释一下正则表达式,?\s*\w+(\sNo\.|\sType|\sName)?=

,?                                             可选逗号
\s*\w+                                     可能前面有空格的单词
(\sNo\.|\sType|\sName)?   可选 a" No."或 a" 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);
于 2012-04-05T23:58:58.970 回答