我从使用StreamReader.ReadLine读入字符串列表的文本文件中得到了一个类似于以下的列表:
CSAclsEN 001 \\sgprt\Projects2 001 CSAclsEN-2010-1130227 10:42 27Feb13 2010 Southgate Branch SS01 001 ****69 Steve Suttill
01 ******10 Business Current Account GBP 2,342,188.38
02 27Feb13 Cheque Cashed 700.00-
02 27Feb13 Cheque Cashed 25.00-
02 27Feb13 Cheque Cashed 1,000.00-
02 27Feb13 Cheque Cashed 1,000.00-
02 27Feb13 CHS 4123-690069-100 20.00-
01 ******11 Personal Current Account GBP 22,456.80
02 27Feb13 Cash Withdrawn 100.00-
02 27Feb13 TFR 130227SS0100103 1,000.00
02 27Feb13 TFR 130227SS0100091 1,234.56
02 27Feb13 TFR 130227SS0100066 2,222.22
02 27Feb13 TFR 130227SS0100064 0.01
我想做的是:
(这适用于收银员应用程序中的客户迷你对帐单)
我正在使用Office.Interop将其写入MS Word模板
LINQ是分离不同类型的记录的最佳方法吗,我将如何做?
输出(在MS Word模板中)将是这样-但没有边界:
该模板只有前两个表(第二个表在Date下仅以一行开始,并且会有可变数量的帐户(以02开头),因此每次代码遇到02时,您看到的第二个表图片中的图片将被复制,或者为新表格添加相同的列,并为每行添加一行01
模板一开始看起来像这样:
并且,每遇到带有01的行,就会在下面添加一个新行,然后当遇到带有02的行时,将启动一个新表。
详细信息:这是对现有应用程序的增强,该应用程序已经处理了类似的列表,但只有一个帐户进行交易。
目前,我通过映射字典中的键/值对来用数据替换“ {}”字段,然后开始像这样处理事务:
int iRow=1;
for (int s = 1; s < pqRequests.Count; s++)
{
string[] sValues = pqRequests[s].Split('\t');
// Transaction List
for (int iDx = 2; iDx <= 5; iDx++)
{
oWordDoc.Tables[2].Cell(iRow, iDx).Range.Text = sValues[iDx - 1];
}
}
oWordDoc.Tables[2].Rows.Add(ref oMissing);
iRow++;
}
现在,我想在相同的过程中处理“帐户列表”迷你对帐单,但是不确定继续前进的最佳方法
我认为LINQ在这里不是最易读的选项。
只需使用经典循环将提高可维护性:
var groupResults = new List<Tuple<string, List<string>>>();
List<string> subLines = null;
foreach(var line in lines)
{
if(line.StartsWith("01"))
{
subLines = new List<string>();
groupResults.Add(Tuple.Create(line, subLines));
}
// consider to handle the case where a line begin with 02 with no 01 before
else if(subLines != null && line.StartsWith("02"))
{
subLines.Add(line);
}
}
您得到的结果按标题分组,并带有对应的02列表。
您现在可以轻松地基于列表列表进行格式化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句