如何读取文件,拆分文件中的字符串,并将输出写入C#中的哈希表?

时间:2009-12-06 19:43:38

标签: c# file split hashtable

我需要读取文件并将字符串拆分为C#中的哈希表。

例如;

1231231嗨这是第一个条目/嗨这是第二个条目

目前,我正在使用StreamReader逐行读取文件中的行,然后我将每行拆分为3个不同的字符串。例如,“1231231”到一个字符串,然后在“/”符号到另一个字符串后最后“/”签到另一个字符串。

1231231将是哈希表的关键,其他将是哈希表的值。我坚持这一部分。

4 个答案:

答案 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();
    }
}