我需要讀取文件並將其拆分爲C#中的哈希表。如何讀取文件,拆分它中的字符串,並將輸出寫入C#中的散列表?
例如;
1231231你好,這是第一個進入/你好,這是第二個條目
目前,我正在讀的文件行線使用StreamReader
行,然後我分裂的每一行,以3根不同的弦。例如,將「1231231」改爲一個字符串,然後將「/」改爲另一個字符串,最後在「/」之後標記爲另一個字符串。
1231231將是散列表的關鍵字,其他將是散列表的值。我被困在這一部分。
我需要讀取文件並將其拆分爲C#中的哈希表。如何讀取文件,拆分它中的字符串,並將輸出寫入C#中的散列表?
例如;
1231231你好,這是第一個進入/你好,這是第二個條目
目前,我正在讀的文件行線使用StreamReader
行,然後我分裂的每一行,以3根不同的弦。例如,將「1231231」改爲一個字符串,然後將「/」改爲另一個字符串,最後在「/」之後標記爲另一個字符串。
1231231將是散列表的關鍵字,其他將是散列表的值。我被困在這一部分。
假設你有相當常規的輸入設置,你可能會想用regular expression這個。
這種模式似乎是你想要什麼:
^(\d+)\s+([^/]+)\s+/\s+(.+)$
這將是:
^
:錨開始字符串(\d+)
:一個或多個數字\s+
: 1個或多個空格字符([^/]+)
:1個或多個字符,其不等於「/」\s+/\s+
:1或更大的空白字符加1斜線和1個或多個空白字符(.+)
:1或更大的任何字符的$
:錨結束串正則表達式是一個美麗的野獸:)使用它,直到性能成爲一個問題,然後重寫。 – 2009-12-06 21:22:17
使用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() });
}
}
哈希表值作爲字符串數組插入,因爲密鑰必須是唯一的。
可能更理想,但它會工作:
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);
}
}
代碼將條目添加到哈希表:
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();
}
}
聽起來像某人不再做功課。 – 2009-12-06 19:48:23
因此,密鑰始終是行首的數字,並且您想要一個由/分隔的字符串列表作爲值? – 2009-12-06 19:48:30
我認爲你需要澄清你想要做的事情。如上所述,看起來你想在散列表中有兩個條目,一個是key = 1231231,value =「你好,這是第一個條目」,第二個是key = 1231231,value =「你好,這是第二個條目」 。這不可能。 – jason 2009-12-06 20:09:51