2016-01-31 20 views
0

我目前正在研究一個小項目,它根據條件從'txt'文件返回文本,然後在將它導出到數據庫之前進行分組。在文本文件中,我有:用C#中的文本文件對數據進行分組

C:\測試\ 123

其他線路...

C:\測試\ 124

問題: 「錯誤的說明」。 (這個錯誤是針對目錄124的)

問題:「錯誤描述」。 (此錯誤是目錄124)

C:\測試\ 125

...

我想組「問題」,以及其相關的目錄其導入到數據庫時。到目前爲止,我已經嘗試使用'foreach'來返回行所在的行/開頭的目錄或問題。儘管這會傳遞值,但用戶不清楚問題屬於哪個目錄。理想的情況是我後:

目錄(列1)問題(列2)

C:\測試\ 123 || Null

c:\ test \ 124 ||問題:「錯誤描述」。

c:\ test \ 124 ||問題:「錯誤描述」。

c:\ test \ 125 ||空

任何幫助,你可以給予將不勝感激。上週我一直在絞盡腦汁!

(當前代碼)

 var lines = File.ReadAllLines(filename); 

     foreach (var line in File.ReadLines(filename)) 
     { 
      String stringTest = line; 

      if (stringTest.Contains(directory)) 
      { 
       String test = stringTest; 

       var csb = new SqlConnectionStringBuilder(); 
       csb.DataSource = host; 
       csb.InitialCatalog = catalog; 
       csb.UserID = user; 
       csb.Password = pass; 

       using (var sc = new SqlConnection(csb.ConnectionString)) 
       using (var cmd = sc.CreateCommand()) 
       { 
        sc.Open(); 
        cmd.CommandText = "DELETE FROM table"; 
        cmd.CommandText = "INSERT INTO table (ID, Directory) values (NEWID(), @val)"; 
        cmd.Parameters.AddWithValue("@VAL", test); 
        cmd.ExecuteNonQuery(); 
        sc.Close(); 
       } 
      } 

      if (stringTest.Contains(problem)) 
      { 

同爲問題....

+0

因此,您只考慮以「問題」開頭的行嗎? –

+0

我是的。文件中還有其他行,但我專注於在每個目錄條目後返回問題行。 – Floyd

+0

發佈你現在使用的代碼會很有用,可以節省其他時間來提示你已經試過並丟棄的東西。 – Tim

回答

1

這裏是一個解決方案:

假設你有下面的類來保存結果項目:

public class ResultItem 
{ 
    public string Directory { get; set; } 
    public string Problem { get; set; } 
} 

您可以執行以下操作:

var lines = File.ReadAllLines(filename); 

string current_directory = null; 

List<ResultItem> results = new List<ResultItem>(); 

//maintain the number of results added for the current directory 
int problems_added_for_current_directory = 0; 

foreach (var line in lines) 
{ 
    if (line.StartsWith("c:\\test")) 
    { 
     //If we are changing to a new directory 
     //And we didn't add any items for current directory 
     //Add a null result item 
     if (current_directory != null && problems_added_for_current_directory == 0) 
     { 
      results.Add(new ResultItem 
      { 
       Directory = current_directory, 
       Problem = null 
      });        
     } 

     current_directory = line; 

     problems_added_for_current_directory = 0; 
    } 
    else if (line.StartsWith("Problem")) 
    { 
     results.Add(new ResultItem 
     { 
      Directory = current_directory, 
      Problem = line 
     }); 

     problems_added_for_current_directory++; 
    } 
} 

//If we are done looping 
//And we didn't add any items for current (last) directory 
//Add a null result item 
if (current_directory != null && problems_added_for_current_directory == 0) 
{ 
    results.Add(new ResultItem 
    { 
     Directory = current_directory, 
     Problem = null 
    }); 
} 
+0

這是一個很好的答案,併產生我所需要的。 – Floyd

+0

不客氣。很高興我能幫上忙。 –

相關問題