C# C使用LINQ读取和过滤CSV文件
我正在使用LINQ读取CSV文件并应用过滤器,然后我将获得数据,但问题是,在应用相同过滤器后比较数据时,我的计数数据并不总是匹配的。我正在用Excel打开该CSV文件,但我无法确定我的计数和Excel数据不匹配的原因。所以在这里,我粘贴我的CSV文件链接的完整代码。如果可能,请有人在下载CSV文件后运行我的代码C# C使用LINQ读取和过滤CSV文件,c#,linq,csv,C#,Linq,Csv,我正在使用LINQ读取CSV文件并应用过滤器,然后我将获得数据,但问题是,在应用相同过滤器后比较数据时,我的计数数据并不总是匹配的。我正在用Excel打开该CSV文件,但我无法确定我的计数和Excel数据不匹配的原因。所以在这里,我粘贴我的CSV文件链接的完整代码。如果可能,请有人在下载CSV文件后运行我的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
DataTable oData = null;
public Form1()
{
InitializeComponent();
oData = new DataTable();
oData.Columns.Add("Date", typeof(string));
oData.Columns.Add("Time", typeof(string));
oData.Columns.Add("Incomming", typeof(string));
oData.Columns.Add("Outgoing", typeof(string));
oData.Columns.Add("Miss Call", typeof(string));
}
private void button1_Click(object sender, EventArgs e)
{
TimeSpan StartTime;
TimeSpan EndTime;
bool flag=true;
TimeSpan tsStart = new TimeSpan(09, 00, 00);
TimeSpan tsEnd = new TimeSpan(17, 30, 0);
List<PhoneData> oPhoneData = GetPhoneData(@"d:\report.csv");
bool isFirstTime = false;
oData.Rows.Clear();
while (tsStart < tsEnd)
{
if (!flag)
{
tsStart = new TimeSpan(tsStart.Hours, tsStart.Minutes, int.Parse("01"));
}
flag = false;
StartTime = tsStart;
tsStart = tsStart.Add(new TimeSpan(00, 30, 00));
EndTime = TimeSpan.Parse((tsStart.Hours >= 10 ? tsStart.Hours.ToString() : ("0" + tsStart.Hours.ToString()))
+ ":" + (tsStart.Minutes >= 10 ? tsStart.Minutes.ToString() : ("0" + tsStart.Minutes.ToString())) + ":00");
int incomingCount = (from row in oPhoneData
where row.direction == "I"
&& row.Call_Start.TimeOfDay >= StartTime
&& row.Call_Start.TimeOfDay <= EndTime
&& row.Is_Internal == 0
&& row.continuation == 0
&& row.call_duration.TotalSeconds > 0
&& !row.party1name.Contains("Voice Mail")
&& !row.party1name.Contains("VM")
select 1).Count();
int outgoingCount = (from row in oPhoneData
where row.direction == "O"
&& row.Call_Start.TimeOfDay >= StartTime
&& row.Call_Start.TimeOfDay <= EndTime
&& row.Is_Internal == 0
&& row.continuation == 0
&& row.party1name != "Voice Mail"
&& !row.party1name.StartsWith("VM")
select 1).Count();
int misscallCount = (from row in oPhoneData
where row.direction == "I"
&& row.continuation == 0
&& row.Caller.Trim() != string.Empty
&& row.Call_Start.TimeOfDay >= StartTime
&& row.Call_Start.TimeOfDay <= EndTime
&& row.party1name != "Voice Mail"
&& !row.party1name.StartsWith("VM")
&& !row.party1name.StartsWith("Line")
&& row.Park_Time == 0
&& row.Called_number == "687220"
select 1).Count();
DataRow dr = oData.NewRow();
dr["Date"] = "12-04-2016";
dr["Time"] = StartTime + "-" + EndTime;
dr["Incomming"] = incomingCount;
dr["Outgoing"] = outgoingCount;
dr["Miss Call"] = misscallCount;
oData.Rows.Add(dr);
}
dgList.DataSource = oData;
MessageBox.Show("Job Done");
}
public List<PhoneData> GetPhoneData(string strFileName)
{
return File.ReadLines(strFileName)
.Skip(1)
.Where(s => s != "")
.Select(s => s.Split(new[] { ',' }))
.Select(a => new PhoneData
{
Call_Start = DateTime.Parse( a[0]),
call_duration = TimeSpan.Parse(a[1]),
Ring_duration = int.Parse(a[2]),
direction = a[4],
Is_Internal =Convert.ToInt32( a[8]),
continuation = int.Parse( a[10]),
party1name = a[13],
Caller = a[3],
Park_Time = Convert.ToInt32(a[16]),
Called_number = a[5]
})
.ToList();
}
}
public class PhoneData
{
public DateTime Call_Start { get; set; }
public TimeSpan call_duration { get; set; }
public Int32 Ring_duration { get; set; }
public string direction { get; set; }
public Int32 Is_Internal { get; set; }
public Int32 continuation { get; set; }
public string party1name { get; set; }
public string Caller { get; set; }
public Int32 Park_Time { get; set; }
public string Called_number { get; set; }
}
}
为什么不使用CSVhelper将文件解析为列表,然后在列表上执行必要的LINQ
这是读取CSV的方法。我检查了您的代码,您必须更改列PartyName的索引,因为列位置是12而不是13 所以这列的条件是错误的
party1name = a[12]
我想看看你的csv,但在玩了一些愚蠢的游戏《有多少动物》之后,我对通过广告获取它失去了兴趣。我给了一个csv文件的链接,当你点击该链接时,csv将下载。我只是不明白这里有什么这么愚蠢的事情?csv看起来确实有敏感信息。对我来说,下载链接不是直接的下载链接,它拉了一个屏幕,免费点击下载,点击后我看到了一些有多少动物。。我以为这是一个捕捉的东西,然后是一个广告。。之后。。我失去了兴趣。不在我的电脑上,按说明让我离开。列位置从1开始,应该是13而不是12。最好说明为什么您认为它应该是12?但是为什么您在Call_start=DateTime中以0开头。解析[0]您可以将数据源oPhoneData分配给gridview,您可以看到结果,即显示在oPhoneData的partyName列上的csv文件Party2Device列中的数据。很抱歉,您是对的。我犯了错误。是的,第1方的名字应该从第12位取下来。很好,我很高兴听到这个消息。