2013-12-19 189 views
2

我從一個文本文件中像下面的列表,這是我在使用StreamReader.ReadLine成一個字符串列表閱讀:使用LINQ查詢列表

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  

我想要做的是:

  1. 輸出第一行一次作爲每次一列的前兩個字符是我將該輸出標頭信息的迷你語句頭
  2. 賬戶
  3. 後跟格式化列表直到下一行其中我將再次輸出標題信息等等。

(這是一個出納應用客戶迷你語句)

我使用Office.Interop

LINQ是爲了單獨以最好的方式去寫這封信,一個MS Word模板不同類型的記錄,我該怎麼做?

輸出(在MS Word模板)會是這樣 - 但沒有國界

enter image description here

模板只前兩名(和第二表只啓動在日期下一行,並且會有可變數量的帳戶(從開始),所以每次代碼遇到時,您在圖片中看到的第二個表格將被複制,或者可能是EW表添加相同的列和行添加到每一行wityh

模板看起來像這樣在開始: enter image description here

此外,與每一行遇到新行被添加到下面,那麼當遇到一條具有的行時,將啓動一個新表。

更多信息: 這是對現有應用程序的改進,該應用程序已經處理了類似的列表,但只有一個帳戶與交易。

目前我通過映射鍵值對在字典替換數據的「{}」字段,然後開始處理這樣的事務:

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++; 
    } 

現在,我想繼續我的在同一個程序中處理帳戶清單mini語句,但我不確定最佳的前進方式

+2

*列表與01直到01下一行*您是否意指*列表與** 02 **直到下一行與01 * – sloth

+1

LINQ可以幫助你做到這一點,但你可以提供確切的輸出你需要? –

+0

@DominicKexel:是的,你說得對,我犯了一個錯誤 –

回答

3

我不認爲LINQ將會是最受歡迎的選項。
只需使用經典的循環將提高maintainbility:

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對應的列表。
現在您可以輕鬆地根據此列表進行格式設置。

+0

我閱讀reqs的方式似乎沒有任何分組的理由。只需一行一行地重新格式化即可。 –