Как можно прочитать файл, разбить строки в нем и записать вывод в хеш-таблицу в C #? - PullRequest
0 голосов
/ 06 декабря 2009

Мне нужно прочитать файл и разбить строку на хеш-таблицу в C #.

Например;

1231231 Привет, это первая запись / Привет, это вторая запись

В настоящее время я читаю строки в файлах построчно, используя StreamReader, а затем разделяю каждую строку на 3 разные строки. Например, «1231231» для одной строки, затем знак «/», наконец, для другой строки после знака «/» для другой строки.

1231231 будет ключом хеш-таблицы, а остальные будут значениями хеш-таблицы. Я застрял на этой части.

Ответы [ 4 ]

4 голосов
/ 06 декабря 2009

Предполагая, что у вас достаточно обычный набор ввода, вы, вероятно, захотите использовать для этого регулярное выражение .

Этот шаблон выглядит так, как вы хотите:

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

Это было бы:

  • ^: привязка к началу строки
  • (\d+): одна или несколько цифр
  • \s+: 1 или более пробельных символов
  • ([^/]+): 1 или более символов, которые не равны '/'
  • \s+/\s+: 1 или более пробельных символов плюс 1 косая черта и 1 или более пробельных символов
  • (.+): 1 или более символов
  • $: привязка к концу строки
0 голосов
/ 07 декабря 2009

Код для добавления записей в хеш-таблицу:

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();
    }
}
0 голосов
/ 06 декабря 2009

Может быть более оптимальным, но это будет работать:

        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 голосов
/ 06 декабря 2009

Использование регулярного выражения Бобби ..

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

Значения хеш-таблицы вставляются в виде массива строк, поскольку ключ должен быть уникальным.

...