2009-12-06 40 views
0

我需要讀取文件並將其拆分爲C#中的哈希表。如何讀取文件,拆分它中的字符串,並將輸出寫入C#中的散列表?

例如;

1231231你好,這是第一個進入/你好,這是第二個條目

目前,我正在讀的文件行線使用StreamReader行,然後我分裂的每一行,以3根不同的弦。例如,將「1231231」改爲一個字符串,然後將「/」改爲另一個字符串,最後在「/」之後標記爲另一個字符串。

1231231將是散列表的關鍵字,其他將是散列表的值。我被困在這一部分。

+2

聽起來像某人不再做功課。 – 2009-12-06 19:48:23

+0

因此,密鑰始終是行首的數字,並且您想要一個由/分隔的字符串列表作爲值? – 2009-12-06 19:48:30

+0

我認爲你需要澄清你想要做的事情。如上所述,看起來你想在散列表中有兩個條目,一個是key = 1231231,value =「你好,這是第一個條目」,第二個是key = 1231231,value =「你好,這是第二個條目」 。這不可能。 – jason 2009-12-06 20:09:51

回答

4

假設你有相當常規的輸入設置,你可能會想用regular expression這個。

這種模式似乎是你想要什麼:

^(\d+)\s+([^/]+)\s+/\s+(.+)$ 

這將是:

  • ^:錨開始字符串
  • (\d+):一個或多個數字
  • \s+: 1個或多個空格字符
  • ([^/]+):1個或多個字符,其不等於「/」
  • \s+/\s+:1或更大的空白字符加1斜線和1個或多個空白字符
  • (.+):1或更大的任何字符的
  • $:錨結束串
+0

正則表達式是一個美麗的野獸:)使用它,直到性能成爲一個問題,然後重寫。 – 2009-12-06 21:22:17

0

使用Bobby的正則表達式的..

static void Main(string[] args) 
    { 
      Hashtable hashtable = new Hashtable(); 
      string[] fileLines = File.ReadAllLines(@"PATH\FILE.TXT"); 

      foreach (string line in fileLines) 
      { 
      var match = Regex.Match(line, @"^(\d+)\s+([^/]+)\s+/\s+(.+)$"); 
      hashtable.Add(match.Groups[0].ToString(), new string[] { match.Groups[1].ToString(), match.Groups[2].ToString() }); 
      } 
     } 

哈希表值作爲字符串數組插入,因爲密鑰必須是唯一的。

0

可能更理想,但它會工作:

 char stringSplit = '/'; 
     char keySplit = ' '; 
     Dictionary<string,string[]> dictionary = new Dictionary<string, string[]>(1000); 
     using(StreamReader sr = new StreamReader(@"c:\somefile.txt")) 
     { 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       int keyIndex = line.IndexOf(keySplit); 
       string key = line.Substring(0, keyIndex); 
       string[] values = line.Substring(keyIndex + 1).Split(stringSplit); 
       dictionary.Add(key,values); 
      } 
     } 
0

代碼將條目添加到哈希表:

Hashtable hashtable = new Hashtable(new EqualityComparer()); 
string[] fileLines = File.ReadAllLines(@"somePath"); 
foreach (var fileLine in fileLines) 
{ 
    int indexOfSpace = fileLine.IndexOf(' '); 
    int indexOfSlash = fileLine.IndexOf('/'); 
    string keyString = fileLine.Remove(indexOfSpace); 
    string firstValue = 
      fileLine.Substring(indexOfSpace, indexOfSlash - indexOfSpace - 1); 
    string secondValue = fileLine.Substring(indexOfSlash + 1); 
    hashtable.Add(new Key(keyString), firstValue); 
    hashtable.Add(new Key(keyString), secondValue); 
} 

Key類來包裝相同的字符串:

public class Key 
{ 
    private readonly string s; 

    public Key(string s) 
    { 
     this.s = s; 
    } 

    public string KeyString 
    { 
     get { return s; } 
    } 
} 

供應GetHashCode功能,以m ake基於相同字符串的兩個鍵轉到hashtable中的相同條目:

public class EqualityComparer : IEqualityComparer 
{ 
    public bool Equals(object x, object y) 
    { 
     return ReferenceEquals(x, y); 
    } 

    public int GetHashCode(object obj) 
    { 
     return ((Key) obj).KeyString.GetHashCode(); 
    } 
} 
相關問題