写入csv文件

时间:2012-04-05 23:25:50

标签: c# text csv

我以文字的形式收到警报,如下所示

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 .

我无法将它们分成单独的区域。

显示的结果为

Example results

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

像somthin一样

enter image description here

真的很讨厌: - )

请帮助,提前谢谢

2 个答案:

答案 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);