2013-02-28 57 views
3

我有一個記事本(.txt)文件,它有三個字段,即ID名稱和位置。我想使用streamreader在C#中讀取這些數據,並檢查文件中ID是否存在的條件。如果是,我應該得到該行作爲輸出其他錯誤。如何在.txt文件中存儲數據時驗證並返回數據?

假設我有以下txt文件與領域

00125 JAMES LONDON 
00127 STARK USA 
00128 ARNOLD AUSTRALIA 

現在,我應該要求用戶輸入有ID。如果Id匹配,那麼我應該得到該特定的行作爲輸出。例如。如果用戶輸入00127,然後我應該得到輸出

00127 JAMES LONDON 

我知道這將是非常簡單的有數據存儲在數據庫中。但是如果數據存儲在.txt文件中呢?

由於提前

+4

您嘗試了哪些?你有沒有爲自己研究過這個? http://whathaveyoutried.com – Joetjah 2013-02-28 14:56:54

+0

另請參見:http://stackoverflow.com/questions/how-to-ask – Joetjah 2013-02-28 14:57:41

+0

一切是真的在一行中還是在一行中的ID名稱和位置,然後在下一個ID名稱和位置下一行?在任何情況下,都會想到'String.Split('')'... – Corak 2013-02-28 15:01:30

回答

0

可以使用StreamReader從文件中讀取內容。

然後,您可以使用Split拆分String

因此,您可以將所有項目添加到二維數組中。然後數組看起來像{{00125, JAMES, LONDON}, {00127, STARK, USA}, {00128, ARNOLD, AUSTRALIA}}。使用它,您可以將輸入與每個數組的第一個條目進行比較,然後相應地返回數據。

這應該給你清楚從現在開始的路。

+0

PS。我不知道該怎麼做,但我在5分鐘內將它們一起搜索了一遍....... – Joetjah 2013-02-28 15:03:22

0

有幾種選擇:

  • 每次閱讀血腥文件你的請求。如果文件很小並且請求不頻繁,這將工作正常。您可以逐行閱讀,並將id與用戶的id進行比較。實施起來非常快,但資源利用率卻很低下。運行時間複雜度爲O(N) - 您需要在最壞的情況下掃描整個文件。

  • 您可以修改第一個選項並添加一層緩存。如果您經常查詢相同的id,您將獲得不錯的性能提升。運行時間複雜度仍然是O(N) - 您需要在最壞的情況下掃描整個文件。這距離快速還很遙遠。

  • 您還可以嘗試對文件ids進行一次排序。用最好的算法,這將花費O(N x Log(N)時間,你花費一次預處理數據。但是,可以使用基於id的二分搜索在O(Log(N))中執行任何讀取查詢。

如果你正在尋找的代碼片段,我會尋找StreamReaderTextReaderStreamWriterbinary searchquick sort。野外有很多樣本......

1

簡單的解決方案(假設你已經固定ID的格式 - 5位):

var users = File.ReadAllLines("data.txt") 
       .ToDictionary(line => line.Substring(0, 5)); 

這造成用線作爲值和ID作爲密鑰字典。用法:

string line = users["00125"]; // 00125 JAMES LONDON 

這是最簡單的解決方案。但實際上,我會介紹一些類,如:

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Location { get; set; } 

    public static User Parse(string s) 
    { 
     var parts = s.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries); 
     return new User { 
      Id = Int32.Parse(parts[0]), 
      Name = parts[1], 
      Location = parts[2] 
     }; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0:00000} {1} {2}", Id, Name, Location); 
    } 
} 

然後分析每一行,並把用戶Dictionary<int, User>類型的字典。這將使您的代碼具有強類型並且更易於維護:

var users = File.ReadAllLines("data.txt") 
       .Select(line => User.Parse(line)) 
       .ToDictionary(u => u.Id); 

var user = users[127]; 
string name = user.Name; // STARK 
Console.WriteLine(user); // 00127 STARK USA 
相關問題