我在一个文本文件中有一个如下所示的列表,我使用 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模板中)将是这样的 - 但没有边框:
模板只有前两个(,第二个表在日期下只有一行开头,并且会有一个可变数量的帐户(以 02 开头)因此,每次代码遇到 02 时,您在图片中看到的第二个表格都会被复制,或者可能是新表格添加了相同的列并为每行添加了一行wityh 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++;
}
现在,我想在同一程序中继续处理帐户列表迷你声明,但我不确定最佳方法前进
答案 0 :(得分:3)
我不认为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对应的列表 您现在可以根据此列表列表轻松进行格式化。