[英]C# Split Date and Time format into Datatable
我有一个带有服务器日志的CSV文件。 我需要将日期/时间格式作为附件图像拆分到我的数据表中。
CSV txt文件示例
10.115.10.74--[20 / Mar / 2016:03:38:14 +0800]“ GET /portal/images/banners/iot.jpg HTTP / 1.1” 404918“ http://www.utem.edu.my / portal / “” Mozilla / 5.0(Windows NT 6.3; WOW64; rv:45.0)Gecko / 20100101 Firefox / 45.0“
172.16.75.219--[20 / Mar / 2016:03:38:17 +0800]“ GET / HTTP / 1.1” 200 98“ http://192.168.0.1:8090/httpclient.html ”“ Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 43.0.2357.124 Safari / 537.36“
我有什么办法可以实现这样的目标?
到目前为止我尝试过的
string[] raw_text = System.IO.File.ReadAllLines("C:\\log4.csv");
string[] data_col = null;
int x = 0;
foreach (string text_line in raw_text)
{
//MessageBox.Show(text_line);
data_col = text_line.Split(' ', '<', '>', '[', ']', '-', '"', ';', '(', ')', '+', ':');
if (x == 1)
{
for (int i = 0; i <= data_col.Count() - 1; i++)
{
my_datatable.Columns.Add(data_col[i]);
}
x++;
}
else
{
my_datatable.Rows.Add(data_col);
}
检查以下代码。 希望对您有所帮助
string[] raw_text = System.IO.File.ReadAllLines("C:\\log4.csv");
string[] data_col = null;
int x = 0;
foreach (string text_line in raw_text)
{
//MessageBox.Show(text_line);
data_col = text_line.Split(' ', '<', '>', '[', ']', '-', '"', ';', '(', ')', '+', ':');
if (x == 1)
{
for (int i = 0; i <= data_col.Count() - 1; i++)
{
my_datatable.Columns.Add(data_col[i]);
my_datatable.Columns.Add(Convert.ToDateTime(data_col[i]).ToString("ddMMMyyyy"));
my_datatable.Columns.Add(Convert.ToDateTime(data_col[i]).ToString("HH:mm tt"));
my_datatable.Columns.Add(Convert.ToDateTime(data_col[i]).ToString("zzz"));
my_datatable.Columns.Add(data_col[i]);
}
x++;
}
else
{
my_datatable.Rows.Add(data_col);
}
您可以这样进行; 这是骨架。 您将需要遍历(或使用linq)来转换日期。 使以下代码成为函数,并将日期作为参数传递。
var parts = ("20/Mar/2016:03:38:17 +800").Split(':').ToList();
var datePart = parts[0];
var timePart = parts.Except(new[]{datePart});
var timeString = string.Join(":", timePart);
var time = timeString.Split('+')[0];
var gmt = "+" + timeString.Split('+')[1];
Console.WriteLine(datePart);
Console.WriteLine(time);
Console.WriteLine(gmt);
我根据您现有的源代码得出此答案。 根据您的需要进行调整。
从样本日志文件中:
10.115.10.74 - - [20/Mar/2016:03:38:14 +0800] "GET /portal/images/banners/iot.jpg HTTP/1.1" 404 918 "http://www.utem.edu.my/portal/" "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
172.16.75.219 - - [20/Mar/2016:03:38:17 +0800] "GET / HTTP/1.1" 200 98 "http://192.168.0.1:8090/httpclient.html" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
控制台应用程序:
class Foo
{
public string IPAddress { get; set; }
public string Date { get; set; }
public string Time { get; set; }
public string TimeZone { get; set; }
public string Request { get; set; }
}
class Program
{
static void Main(string[] args)
{
string[] lines = File.ReadAllLines("Log.txt");
DataTable dt = new DataTable();
dt.Columns.Add("IP Address");
dt.Columns.Add("Date");
dt.Columns.Add("Time");
dt.Columns.Add("GMT");
dt.Columns.Add("Method");
foreach(string line in lines)
{
string[] split = line.Split(' ', '<', '>', '[', ']', '-', '"', ';', '(', ')', '+', ':');
split = split.Where(r => !string.IsNullOrWhiteSpace(r)).ToArray();
Foo foo = new Foo();
foo.IPAddress = split[0];
foo.Date = split[1];
foo.Time = string.Format("{0}:{1}:{2}", split[2], split[3], split[4]);
foo.TimeZone = split[5];
foo.Request = split[6];
dt.Rows.Add(foo.IPAddress, foo.Date, foo.Time, foo.TimeZone, foo.Request);
}
foreach(DataRow dr in dt.Rows)
{
Console.WriteLine(string.Format("{0} {1} {2} {3} {4}", dr[0], dr[1], dr[2], dr[3], dr[4]));
}
Console.ReadLine();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.