C# C使用LINQ读取和过滤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

我正在使用LINQ读取CSV文件并应用过滤器,然后我将获得数据,但问题是,在应用相同过滤器后比较数据时,我的计数数据并不总是匹配的。我正在用Excel打开该CSV文件,但我无法确定我的计数和Excel数据不匹配的原因。所以在这里,我粘贴我的CSV文件链接的完整代码。如果可能,请有人在下载CSV文件后运行我的代码

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位取下来。很好,我很高兴听到这个消息。