obdgy
obdgy

Reputation: 459

Convert a txt file to dictionary<string, string>

I have a text file and I need to put all even lines to Dictionary Key and all even lines to Dictionary Value. What is the best solution to my problem?

int count_lines = 1;
Dictionary<string, string> stroka = new Dictionary<string, string>();

foreach (string line in ReadLineFromFile(readFile))
{
    if (count_lines % 2 == 0)
    {
        stroka.Add Value
    }
    else
    { 
       stroka.Add Key
    }

    count_lines++;
}

Upvotes: 0

Views: 20959

Answers (4)

BrunoLM
BrunoLM

Reputation: 100321

You can read line by line and add to a Dictionary

public void TextFileToDictionary()
{
    Dictionary<string, string> d = new Dictionary<string, string>();

    using (var sr = new StreamReader("txttodictionary.txt"))
    {
        string line = null;

        // while it reads a key
        while ((line = sr.ReadLine()) != null)
        {
            // add the key and whatever it 
            // can read next as the value
            d.Add(line, sr.ReadLine());
        }
    }
}

This way you will get a dictionary, and if you have odd lines, the last entry will have a null value.

Upvotes: 2

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186668

  String fileName = @"c:\MyFile.txt";
  Dictionary<string, string> stroka = new Dictionary<string, string>();

  using (TextReader reader = new StreamReader(fileName)) {
    String key = null;
    Boolean isValue = false;

    while (reader.Peek() >= 0) {
      if (isValue)
        stroka.Add(key, reader.ReadLine());
      else
        key = reader.ReadLine();

      isValue = !isValue;
    }
  }

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726529

Try this:

var res = File
    .ReadLines(pathToFile)
    .Select((v, i) => new {Index = i, Value = v})
    .GroupBy(p => p.Index / 2)
    .ToDictionary(g => g.First().Value, g => g.Last().Value);

The idea is to group all lines by pairs. Each group will have exactly two items - the key as the first item, and the value as the second item.

Demo on ideone.

Upvotes: 8

pascalhein
pascalhein

Reputation: 5846

You probably want to do this:

var array = File.ReadAllLines(filename);
for(var i = 0; i < array.Length; i += 2)
{
    stroka.Add(array[i + 1], array[i]);
}

This reads the file in steps of two instead of every line separately.

I suppose you wanted to use these pairs: (2,1), (4,3), ... . If not, please change this code to suit your needs.

Upvotes: 2

Related Questions