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 .

私はそれらを別々のフィールドに分割することができませんでした。

表示されている結果は次のとおりです。

結果の例

詳細を分割したい詳細の各要素を列に入れたい

somthinのように

ここに画像の説明を入力してください

その本当に迷惑:-)

助けてください、事前にありがとう

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]:「データセンターSTALZAC障害」  
    [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]:「HSJYG500GSM」  
    [13]:「Google1。」  

-

正規表現について説明します,?\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 に答える