【问题标题】:C# Split Date and Time format into DatatableC# 将日期和时间格式拆分为数据表
【发布时间】:2017-11-07 02:21:33
【问题描述】:

我有一个带有服务器日志的 CSV。我需要将日期/时间格式作为附加图像拆分到我的数据表中。

CSV txt 文件示例

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,如 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);
    }

【问题讨论】:

  • 发布 csv 的文本版本,以便我们更轻松地进行测试。
  • 已更新,不便之处敬请见谅..
  • 您如何显示这些数据?如果它是某种形式的网格控件,是否有可能将网格中的多个列绑定到单个数据列,然后独立地格式化这些列?这意味着您可以在数据表中保持 data 完整,只需调整它的显示方式
  • 实际上,由于: 字符用作拆分字符(例如20/Mar/2016, 03, 38, 14, 0800),您的代码在时间部分遇到了拆分问题。我认为DateTime.TryParsedd/MMM/yyyy:HH:mm:ss 格式可以解决这个问题。
  • 我建议您使用适当的 CSV 解析器库。这种格式足够复杂,可以由上面的自制代码处理。

标签: c# datatable


【解决方案1】:

检查以下代码。希望对你有帮助

        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);
            }

【讨论】:

  • 试过了,不行。谢谢您的回复先生。
【解决方案2】:

我根据您现有的源代码给出了这个答案。根据您的需要进行调整。

来自示例日志文件:

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();
    }
}

输出:

【讨论】:

  • 我试过这个方法,但我使用 System.IO.File.ReadAllLines("C:\\log4.csv");但它出现空白窗口输出。有什么想法吗?
  • 已更新 - 它已加载,但我不知道为什么它没有将日期/时间部分分隔到不同的列中。我完全尝试了你所做的......我不知道可能出了什么问题:/
【解决方案3】:

你可以这样做;这是一个骨架。您将需要循环(或使用 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);     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多