C# 从2数据表中获取每小时的总和
我正在从2数据表中写入一个txt文件。C# 从2数据表中获取每小时的总和,c#,datatable,C#,Datatable,我正在从2数据表中写入一个txt文件。 以下是2个数据表 dt1 Transaction No. Time Amount Date 1 10:00:00 200.00 03/05/2020 2 10:30:11 250.00 03/05/2020 3 11:05:22 140.00 03/05/2020 4
以下是2个数据表
dt1
Transaction No. Time Amount Date
1 10:00:00 200.00 03/05/2020
2 10:30:11 250.00 03/05/2020
3 11:05:22 140.00 03/05/2020
4 11:45:33 230.00 03/05/2020
5 12:15:10 220.00 03/05/2020
dt2
Transaction No. Added Amount Date
1 40.00 03/05/2020
2 25.00 03/05/2020
3 40.00 03/05/2020
4 30.00 03/05/2020
5 30.00 03/05/2020
下面是我的代码
使用(StreamWriter sw=File.AppendText(文件名))
{
对于(int a=6;a,假设您有两个DataTable-s
,并用所述数据填充它们
var dt1=新数据表();
var dt2=新数据表();
dt1.Columns.AddRange(新[]
{
新数据列(“交易编号”,类型(int)),
新数据列(“时间”,类型(日期时间)),
新数据列(“金额”,类型(十进制)),
新数据列(“日期”,类型(日期时间)),
});
dt2.Columns.AddRange(新[]
{
新数据列(“交易编号”,类型(int)),
新数据列(“增加金额”,类型(十进制)),
新数据列(“日期”,类型(日期时间)),
});
注意:双
类型已替换为十进制
类型,因为它是处理货币时使用的正确类型
据我所知,您希望将dt1
行按Time
字段的小时部分进行分组,将金额
相加,并将dt2
行中的添加金额
相加,其中交易编号
等于分组行中的任何交易编号。
属于dt1
这将有助于:
var group=dt1.AsEnumerable().GroupBy(x=>x.Field(1.Hour);
var sb=新的StringBuilder();
某人附加(“日期”);
某人附加(“时间,”.PadLeft(12,”);
sb.AppendLine(“Sum.PadLeft(5)”);
//如果输出中不需要PadLeft,则只需:
//sb.追加行($“日期、时间、金额”);
foreach(组中的var g)
{
var总和=0M;
foreach(g中的var r)
sum+=r.Field(2)+dt2.AsEnumerable()
.式中(x=>x.Field(0)=r.Field(0))
.Sum(x=>x.Field(1));
sb.AppendLine($”{g.First().Field(3).ToString(“MM/dd/yyyy”)},{g.Key.ToString(“00”)}:00,{sum.ToString(“0.00”);
}
注意:您可以使用字段名称而不是索引
输出为:
Date, Time, Sum
03/05/2020, 10:00, 515.00
03/05/2020, 11:00, 440.00
03/05/2020, 12:00, 250.00
我不知道DataTable-s
是否已经包含生成上一个引号块中提到的输出所需的数据,或者您希望在写入文本文件之前附加其余的数据。在第二种情况下,您可以执行以下操作:
var group=dt1.AsEnumerable().GroupBy(x=>x.Field(1.Hour);
var sb=新的StringBuilder();
sb.追加行($“日期、时间、金额”);
对于(变量i=0;i<24;i++)
{
VARG=group.FirstOrDefault(x=>x.Key==i);
如果(g!=null)
{
var总和=0M;
foreach(g中的var r)
sum+=r.Field(2)+dt2.AsEnumerable()
.式中(x=>x.Field(0)=r.Field(0))
.Sum(x=>x.Field(1));
sb.AppendLine($”{g.First().Field(3).ToString(“MM/dd/yyyy”)},{g.Key.ToString(“00”)}:00,{sum.ToString(“0.00”);
}
其他的
sb.AppendLine($“{group.First().First().Field(3).ToString(“MM/dd/yyyy”)},{i.ToString(“00”)}:00,0.00”);
}
如果需要保留相同的小时顺序:
for(变量ii=6;ii<30;ii++)
{
var i=ii>23?ii%24:ii;
VARG=group.FirstOrDefault(x=>x.Key==i);
如果(g!=null)
{
//同样的。。。
}
最后,要创建或覆盖文本文件(fileName
):
File.WriteAllText(文件名,sb.ToString());
或附加输出:
File.AppendAllText(文件名,sb.ToString());
double sales
然后是sales.Equals(“”)
这永远不会是真的。这段代码编译了吗?LINQ?加入事务号上的两个数据表。给出一些提示?我会尝试一下。谢谢!
Date, Time, Sum
03/05/2020, 10:00, 515.00
03/05/2020, 11:00, 440.00
03/05/2020, 12:00, 250.00