在c#winforms中使用datatable处理csv文件和日期时间

在c#winforms中使用datatable处理csv文件和日期时间,c#,winforms,csv,C#,Winforms,Csv,我有一个.CSV文件() 我已经在DataTable中获取了csv文件的所有值。 现在我要做的是解释如下: 我每5分钟在csv文件中找到D列的最低值。每个最小值将以5分钟的时间间隔插入到L列的第一行。 你可以从中得到想法。此csv文件是输出文件 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sys

我有一个.CSV文件()

我已经在DataTable中获取了csv文件的所有值。 现在我要做的是解释如下:

我每5分钟在csv文件中找到D列的最低值。每个最小值将以5分钟的时间间隔插入到L列的第一行。 你可以从中得到想法。此csv文件是输出文件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Revision2
{
    public partial class Form1 : Form
    {
        DataTable datable = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }

        private void browsebtm_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Select .CSV ffile";
            ofd.ShowDialog();
            txtboxpath.Text = ofd.FileName;
        }

        private void operatebtn_Click(object sender, EventArgs e)
        {
            string filePath = txtboxpath.Text;
            StreamReader sr = new StreamReader(filePath);
            string line = sr.ReadLine();
            string[] value = line.Split(',');

            DataRow row;
            foreach (string dc in value)
            {
                datable.Columns.Add(new DataColumn(dc));
            }
            while (!sr.EndOfStream)
            {
                value = sr.ReadLine().Split(',');
                if (value.Length == datable.Columns.Count)
                {
                    row = datable.NewRow();
                    row.ItemArray = value;
                    datable.Rows.Add(row);
                }
            }


            DateTime dt1 = DateTime.ParseExact(datable.Rows[0][1].ToString(), "dd-MM-yy HH:mm", CultureInfo.InvariantCulture);

            int totalRows = datable.Rows.Count;
            DateTime dt2 = DateTime.ParseExact(datable.Rows[totalRows - 1][1].ToString(), "dd-MM-yy HH:mm", CultureInfo.InvariantCulture);

            DateTime i, j;
            int r = 0, x = 0, z = 0, value1, value2 = 0;
            for (i = dt1; i <= dt2; i = i.AddMinutes(5))
            {
                DateTime dt5 = i.AddMinutes(5);
                if (dt5 >= dt2)
                    break;
                int y = 0;
                for (j = i; j < dt5; j = j.AddSeconds(1))
                {
                    y++;
                    for (r = x; r < 1669; r++)
                    {


                        string str1 = datable.Rows[r][1].ToString();
                        string str2 = j.ToString("dd-MM-yy HH:mm);
                        if (str1 == str2)
                        {

                            value1 = int.Parse(datable.Rows[r][3].ToString());
                            value2 = int.Parse(datable.Rows[x][3].ToString());
                            if (value2 > value1)
                            {
                                value2 = value1;
                            }
                            x++;
                        }
                    }
                    label2.Text = y.ToString();
                    if (r > 1669)
                        break;

                }
                datable.Rows[r][11] = value2;

            }
            label2.Text = i.ToString();
            //label1.Text = y.ToString();
            dataGridView1.DataSource = datable;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
利用制度全球化;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
名称空间修改2
{
公共部分类Form1:Form
{
DataTable datable=新的DataTable();
公共表格1()
{
初始化组件();
}
私有void browsebtm_单击(对象发送者,事件参数e)
{
OpenFileDialog ofd=新建OpenFileDialog();
ofd.Title=“选择.CSV文件”;
ShowDialog();
txtboxpath.Text=ofd.FileName;
}
私有无效操作单击(对象发送方,事件参数e)
{
字符串filePath=txtboxpath.Text;
StreamReader sr=新的StreamReader(文件路径);
字符串行=sr.ReadLine();
string[]value=line.Split(',');
数据行;
foreach(值中的字符串dc)
{
添加(新的DataColumn(dc));
}
而(!sr.EndOfStream)
{
value=sr.ReadLine().Split(',');
if(value.Length==datable.Columns.Count)
{
row=datable.NewRow();
row.ItemArray=值;
datable.Rows.Add(行);
}
}
DateTime dt1=DateTime.ParseExact(datable.Rows[0][1].ToString(),“dd-MM-yy-HH:MM”,CultureInfo.InvariantCulture);
int totalRows=datable.Rows.Count;
DateTime dt2=DateTime.ParseExact(datable.Rows[totalRows-1][1].ToString(),“dd-MM-yy HH:MM”,CultureInfo.InvariantCulture);
日期时间i,j;
int r=0,x=0,z=0,value1,value2=0;
对于(i=dt1;i=dt2)
打破
int y=0;
对于(j=i;j值1)
{
value2=value1;
}
x++;
}
}
label2.Text=y.ToString();
如果(r>1669)
打破
}
datable.Rows[r][11]=value2;
}
label2.Text=i.ToString();
//label1.Text=y.ToString();
dataGridView1.DataSource=datable;
}
}
}
我做错了什么。当我点击操作按钮时,应用程序冻结了。 如何改进代码以实现此目的。
我是新的bie。请帮助尝试这个循环例程。我通常将嵌套限制为3层。在您的情况下,您有5层,很难遵循

int startIndex = 0;
while (startIndex < dt.Rows.Count)
{
    DateTime timeStart = DateTime.ParseExact(dt.Rows[startIndex][1].ToString(), "dd-MM-yy HH:mm",
        CultureInfo.InvariantCulture);
    DateTime timeEnd = timeStart;
    int lowestValue = int.Parse(dt.Rows[startIndex][3].ToString());
    int endIndex = startIndex;

    //loop to find end index of 5 minute loop
    for (int j = startIndex++; j < dt.Rows.Count; j++)
    {
        endIndex = j;
        timeEnd = DateTime.ParseExact(dt.Rows[endIndex][1].ToString(), "dd-MM-yy HH:mm",
            CultureInfo.InvariantCulture);
        if ((timeEnd - timeStart).TotalMinutes > 5)
        {
            break;
        }
        int newValue = int.Parse(dt.Rows[endIndex][3].ToString());
        if (newValue < lowestValue)
        {
            lowestValue = newValue;
        }
    }

    //loop from start to end to set lowest value
    for (var k = startIndex; k < endIndex; k++)
    {
        dt.Rows[k][11] = lowestValue.ToString();
    }

    startIndex = endIndex;
}
intstartindex=0;
while(startIndex5)
{
打破
}
int newValue=int.Parse(dt.Rows[endIndex][3].ToString());
如果(新值<最低值)
{
最低值=新值;
}
}
//从开始到结束循环以设置最低值
对于(var k=startIndex;k
使用Linq进行这些类型的转换更容易。 以下是Linq示例(我将您的CSV下载到d:\temp\CRUDE1Minute.CSV-您可以复制并粘贴以下代码,并在LinqPad adding windows.forms命名空间中运行):

编辑:顺便说一句,我不清楚你在这5分钟的开放,低,…上选择了什么,可能是错误的选择分钟所有。也许你想做:

...
select new
{
    date = barData.Key.date,
    open = barData.First().Open, //barData.Min( bd => bd.Open ),
    low = barData.Min(bd => bd.Low),
    high = barData.Max(bd => bd.High),
    close = barData.Last().Close
};

首先,使用调试器单步检查代码,以更准确地确定问题发生的位置,以及此时您遇到的异常或其他意外行为(如果有的话)。在DataTable中,大约有1670行…如何通过断点检查此问题DataTable不是此作业的正确控件。只需使用Linq。这是什么t?但问题不在DataTable中,问题在某个地方的循环中。Cetin指出,如果您使用Linq,您可能不需要循环。虽然我现在还不清楚如何使用Linq来实现需求,但我想,经过一点思考,这是可能的。您知道我的所有需求吗?这对我有很大帮助
...
select new
{
    date = barData.Key.date,
    open = barData.First().Open, //barData.Min( bd => bd.Open ),
    low = barData.Min(bd => bd.Low),
    high = barData.Max(bd => bd.High),
    close = barData.Last().Close
};