第一行作为时间字段,后面行等号前面作为字段名 等号后面作为字段值。由空格将数据分为几块,每块相当于表中的一行。
怎么读取? 根据 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
怎么读取? 根据 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
C#就用DataTable作为更新,文件读取到空行就是一条记录结束。
用 SreamReader.ReadLine()一次读一行,除了每块的第一行直接是字段值,其它行用 String.Split() 分隔成字段名和值,按字段名给记录的字段赋值,块中没有的字段就是默认值(NULL)。
那是用insert语句 按字段名 插入值?还是您说的DataTable更新? 初学并不太懂,要是能有一个较为详细的代码将感激不尽。
{
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;
}
把#2代码中的 table、row 的类型换成 DataTable、DataRow(加上第一行时间的处理——用个固定字段),再结合这个博文中的代码,就全了。