我是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();
}
答案 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解析器的风险 - 这是一项复杂而耗时的任务,并且已经有一个很好的库。