【问题标题】:How to filter a CSV with C#如何使用 C# 过滤 CSV
【发布时间】:2019-10-10 00:34:50
【问题描述】:

我有一个包含 2 列的 csv,第一列带有字符串,第二列带有开始和结束时间(例如:11:00-22:00)。例如,您将如何过滤包含 14:00 时间的字段,以尽可能提高性能?

例如:

餐厅名称营业时间

栉鹤 11:30-21:00

大阪屋餐厅 11:30-21:00

臭玫瑰 9:00-22:00

我写 21:30 会显示臭玫瑰,或者如果我写 11:00 在控制台上显示 Kushi Tsuru、Osakaya 餐厅和臭玫瑰。

class Filter
{
    static void Main(string[] args)
    {
        List<Restaurant> csvFile = File.ReadAllLines(@"C:\restaurant-hours.csv")
                                   .Skip(1)
                                   .Select(Restaurant.FromCsv)
                                   .ToList();

        void filter_by_hour()
        {
            Console.WriteLine("\nEnter the hour");
            string Dateofbirth = (Console.ReadLine();
            var filter_data = csvFile.Where(e => (DateTime.Parse(e.OpenHour)) > Dateofbirth)
                              .Select(e => e);
        }

    }
}

【问题讨论】:

  • 您可以将文件加载到 DataTable 中,然后对其进行过滤。 stackoverflow.com/questions/20860101/…
  • @Jac 为什么要使用 DataTable?为什么不创建对象来表示数据?
  • 能否请您edit 发帖展示您当前的不良实施以及您当前/预期的绩效目标?
  • 是的,我已按“:”过滤,但重要的是“我写 21:30 会显示臭玫瑰,或者如果我写 11:00 显示 Kushi Tsuru,大阪屋餐厅和控制台上的臭玫瑰。”
  • 代码csvFile.Where(e =&gt; (DateTime.Parse(e.OpenHour)) &gt; Dateofbirth) 似乎没有检查值是否在范围内(甚至不应该编译,因为DateTime 不能与字符串比较)。你确定你发布了正确的代码吗?另外,提供您的绩效测量/目标的结果,以便可以以实际的方式回答实际的“做……尽可能表现”的问题。还要澄清性能对于一次性操作是否重要,或者是否关注重复调用过滤器。 (感谢您进行编辑以在问题中提供至少部分信息)

标签: c# .net-core console-application


【解决方案1】:

这比 LINQ 和 Lambda 函数更快。此外,许多变量可以删除,只是为了清楚起见添加它们。已经测试过了,可以用。

    static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("a.txt");
            string[] time = Console.ReadLine().Split(':');
            int hour = 0;
            int minute = 0;

            try
            {
               hour = Convert.ToInt32(time[0]);
               minute = Convert.ToInt32(time[1]); 
            }
            catch
            {
               Console.WriteLine("The input must be something like aa:bb, with aa > 00 and aa < 24, bb >= 00 and bb <=53");
               return;
            }

            string[] first_time;
            string[] second_time;
            string[] time_frame;

            int first_hour;
            int first_minute;
            int second_hour;
            int second_minute;

            DateTime _date = new DateTime(1, 1, 1, hour, minute, 0);
            DateTime first_date, second_date;

            string line = "";
            string[] tokens;
            while ((line = reader.ReadLine()) != null)
            {
                tokens = line.Split(' ');
                time_frame = tokens[tokens.Length - 1].Split('-');
                first_time = time_frame[0].Split(':');
                first_hour = Convert.ToInt32(first_time[0]);
                first_minute = Convert.ToInt32(first_time[1]);

                first_date = new DateTime(1, 1, 1, first_hour, first_minute, 0);
                second_time = time_frame[1].Split(':');
                second_hour = Convert.ToInt32(second_time[0]);
                second_minute = Convert.ToInt32(second_time[1]);

                second_date = new DateTime(1, 1, 1, second_hour, second_minute, 0);

                if (_date >= first_date && _date <= second_date)
                {
                    for (int i = 0; i < tokens.Length - 1; i++)
                    {
                        Console.Write(tokens[i]);
                        Console.Write(" ");
                    }
                    Console.WriteLine("");
                }
            }    
            reader.Close();
        }

【讨论】:

  • '输入字符串的格式不正确。'当我使用例如“10:30”
  • 好吧,你没有说任何关于格式错误的输入,所以我只是假设每个输入都是正确的格式。让我编辑代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2015-07-04
相关资源
最近更新 更多