第一行作为时间字段,后面行等号前面作为字段名 等号后面作为字段值。由空格将数据分为几块,每块相当于表中的一行。
怎么读取? 根据 Acct-Status-Type = Start 或STOP 的区别,分为两种类型,以下数据为样本,字段有差别,已用红色标注出来。
能给下代码最好,不知道该如何解析。用C# 写入SQL数据库Sun Mar  1 00:00:01 2015
User-Name = "2014212107"
NAS-IP-Address = 10.128.16.6
NAS-Port = 0
NAS-Port-Type = Wireless-802.11
Acct-Session-Id = "201421219CA9E4A32774-54F2C75B"
Event-Timestamp = "Mar  1 2015 16:01:31 CST"
Acct-Multi-Session-Id = "9CA9E4A32774-0001361023"
Framed-IP-Address = 10.146.215.189
Calling-Station-Id = "9CA9E4A32774"
Called-Station-Id = "001A1E014E48"
Acct-Delay-Time = 0
Aruba-Essid-Name = "CCNU"
Aruba-Location-Id = "AP-YBS-3D-5F-520"
Aruba-Attr-10 = 0x53542d594253312d33442d41502d47524f5550
Aruba-User-Role = "authenticated"
Aruba-User-Vlan = 3050
Aruba-Attr-12 = 0x416e64726f6964
Acct-Status-Type = Start
Acct-Authentic = RADIUS

Acct-Unique-Session-Id = "e6d848391a9b0343"
Timestamp = 1425139201
Request-Authenticator = VerifiedSun Mar  1 00:00:01 2015
User-Name = "2013213815"
NAS-IP-Address = 10.128.16.6
NAS-Port = 0
NAS-Port-Type = Wireless-802.11
Acct-Session-Id = "201321386036DDA4117C-54F2A09D"
Event-Timestamp = "Mar  1 2015 16:01:31 CST"
Acct-Multi-Session-Id = "6036DDA4117C-0001351856"
Framed-IP-Address = 10.146.211.136
Calling-Station-Id = "6036DDA4117C"
Called-Station-Id = "001A1E014E48"
Acct-Delay-Time = 0
Aruba-Essid-Name = "CCNU"
Aruba-Location-Id = "AP-LK-A-2F-214"
Aruba-Attr-10 = 0x53542d4c4b2d41422d41502d47524f5550
Aruba-User-Role = "authenticated"
Aruba-User-Vlan = 3050
Aruba-Attr-12 = 0x57696e646f7773
Acct-Status-Type = Stop
Acct-Input-Octets = 131331343
Acct-Output-Octets = 452622848
Acct-Input-Packets = 521426
Acct-Output-Packets = 512019
Acct-Terminate-Cause = User-Request
Acct-Session-Time = 9318

Acct-Unique-Session-Id = "1ecb959f4107ca07"
Timestamp = 1425139201
Request-Authenticator = Verified

解决方案 »

  1.   

    数据库表格用全集的字段,红色字段可空,黑色字段不可空。
    C#就用DataTable作为更新,文件读取到空行就是一条记录结束。
    用 SreamReader.ReadLine()一次读一行,除了每块的第一行直接是字段值,其它行用 String.Split() 分隔成字段名和值,按字段名给记录的字段赋值,块中没有的字段就是默认值(NULL)。
      

  2.   

    说得真好,大致方向是清楚了。
    那是用insert语句  按字段名 插入值?还是您说的DataTable更新? 初学并不太懂,要是能有一个较为详细的代码将感激不尽。
      

  3.   

    解析这么规范的文本不难,至于入库自己想想吧.private static List<Dictionary<string, string>> LoadData(string fn)
    {
        List<Dictionary<string, string>> table = new List<Dictionary<string, string>>();
        Dictionary<string, string> row = null;    StreamReader sr = new StreamReader(fn);
        string line = null;
        try
        {
            while ((line = sr.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length == 0)
                {
                    row = null;
                }
                else
                {
                    if (row == null)
                    {
                        row = new Dictionary<string, string>();
                        table.Add(row);
                    }
                    string[] items = line.Split(new char[] { '=' }, 2);
                    if (items.Length == 2)
                    {
                        row[items[0].Trim()] = items[1].Trim().Trim('"');
                    }
                }
            }
        }
        finally
        {
            sr.Close();
        }
        return table;
    }
      

  4.   

    winform c# DataTable 批量插入数据库
    把#2代码中的 table、row 的类型换成 DataTable、DataRow(加上第一行时间的处理——用个固定字段),再结合这个博文中的代码,就全了。