过滤包含c#中csv文件范围之间的日期的行

时间:2017-06-20 01:23:36

标签: c# csv

我是c#的新手,也使用csv文件。我需要使用一系列日期过滤csv文件。

csv文件的内容与下面的数据类似。

" EmployeeCode""日期""时间""类型"
" 3434"&#34 01 /2013分之22"" 07:54"" 0"
" 3023"&#34 01 /2014分之23"" 07:54"" 0"
" 2897"&#34 01 /2015分之24"" 07:54"" 0"
" 3734"&#34 01 /2015分之25"" 07:54"" 0"
" 3168"&#34 01 /2015分之26"" 07:54"" 0"
" 4863"&#34 01 /2015分之26"" 07:55"" 0"
" 2513"&#34 01 /2015分之27"" 07:55"" 0"
" 2582"&#34 01 /二千〇一十五分之二十七"" 07:55"" 0"

这应该是输出:

" EmployeeCode""日期""时间""类型"
" 3734"&#34 01 /2015分之25"" 07:54"" 0"
" 3168"&#34 01 /2015分之26"" 07:54"" 0"
" 4863"&#34 01 /2015分之26"" 07:55"" 0"
" 2513"&#34 01 /2015分之27"" 07:55"" 0"
" 2582"&#34 01 /二千〇一十五分之二十七"" 07:55"" 0"

Shell可以做到这一点,它不公平,c#不能。因为在向互联网搜索这类问题后,没有找到解决方案。

尝试此代码。

 DateTime dFm = new DateTime(2015, 01, 25);
 DateTime dTo = new DateTime(2015, 01, 27);

 var lines = System.IO.File.ReadAllLines(txtFileName.Text); 
 var data = lines
            .Skip(1)
            .Select(x => new
            {
                EmpCode = Int32.Parse(x.Split(new string[] { @""",""", @"""" 
             }, StringSplitOptions.RemoveEmptyEntries)[0]),
                Date = DateTime.ParseExact(
                string.Concat(x.Split(new string[] { @""",""", @"""" }, 
                StringSplitOptions.RemoveEmptyEntries)[1], " ",
                x.Split(new string[] { @""",""", @"""" }, 
                StringSplitOptions.RemoveEmptyEntries)[2]),
                "MM/dd/yyyy HH:mm", 
                System.Globalization.CultureInfo.InvariantCulture),
                Type = x.Split(new string[] { @""",""", @"""" }, 
                StringSplitOptions.RemoveEmptyEntries)[3]
            })
            .Where(x => x.Date >= dFm && x.Date <= dTo)
            .ToList();
           }

1 个答案:

答案 0 :(得分:1)

使用CsvHelper实现目标相当容易:

var dFm = new DateTime(2015, 01, 25);
var dTo = new DateTime(2015, 01, 27);
using (var reader = File.OpenText(@"sample.csv"))
{
    var csv = new CsvReader(reader);
    while (csv.Read())
    {
        var date = csv.GetField<DateTime>("Date");
        if (date >= dFm &&
            date <= dTo)
        {
            // process the filtered out records
        }
    }
}

在示例中,我将您的数据存储在sample.csv文件中。此外,在我的机器上我使用欧洲约会(日/月/年)并且必须调整数据。如果设置为美国惯例(月/日/年),我认为你的机器会没问题。

process the filtered out records中,您添加逻辑以将记录写入您的首选输出(我已将其保留为未实现,因为不想破坏所有乐趣)。

如开头所述,我使用CsvHelper。我不会冒着自己实施CSV解析器的风险 - 这是一项复杂而耗时的任务,并且已经有一个很好的库。