我需要读取文件并将字符串拆分为C#中的哈希表。
例如;
1231231嗨这是第一个条目/嗨这是第二个条目
目前,我正在使用StreamReader
逐行读取文件中的行,然后我将每行拆分为3个不同的字符串。例如,“1231231”到一个字符串,然后在“/”符号到另一个字符串后最后“/”签到另一个字符串。
1231231将是哈希表的关键,其他将是哈希表的值。我坚持这一部分。
答案 0 :(得分:4)
假设您有相当规则的输入集,您可能想要使用regular expression来实现此目的。
这种模式看起来像你想要的那样:
^(\d+)\s+([^/]+)\s+/\s+(.+)$
那将是:
^
:锚定字符串(\d+)
:一个或多个数字\s+
:一个或多个空格字符([^/]+)
:一个或多个字符不等于'/'\s+/\s+
:1个或多个空格字符加1个斜杠和1个或多个空格字符(.+)
:任意一个或多个字符$
:锚定到字符串结尾答案 1 :(得分: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() });
}
}
哈希表值作为字符串数组插入,因为键必须是唯一的。
答案 2 :(得分: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);
}
}
答案 3 :(得分: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);
}
用于包装相同字符串的键类:
public class Key
{
private readonly string s;
public Key(string s)
{
this.s = s;
}
public string KeyString
{
get { return s; }
}
}
提供 GetHashCode 功能的等同比较器,以便使基于相同字符串的两个键转到哈希表中的相同条目:
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();
}
}