在c#winforms中使用datatable处理csv文件和日期时间
我有一个.CSV文件() 我已经在DataTable中获取了csv文件的所有值。 现在我要做的是解释如下: 我每5分钟在csv文件中找到D列的最低值。每个最小值将以5分钟的时间间隔插入到L列的第一行。 你可以从中得到想法。此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
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
};