2010-05-12 8 views
3

Je suis en train de lire un fichier ini qui a le format suivant:lecture du fichier en C#

SETTING=VALUE 
SETTING2=VALUE2 

J'ai actuellement le code suivant:

string cache = sr.ReadToEnd();      
string[] splitCache = cache.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries); 

Ce qui me donne une liste des paramètres , cependant, ce que je voudrais faire est de lire ceci dans un dictionnaire. Ma question est, est-il un moyen de faire cela sans itération à travers le tableau entier et peupler manuellement le dictionnaire?

+0

pourquoi ne pas simplement utiliser une boucle foreach? – Yoda

+0

Je pourrais - mais la question était que je pourrais le faire sans itérer à travers le tableau. –

+1

http://www.codeproject.com/KB/cs/readwritexmlini.aspx est un bon lecteur INI si vous voulez passer le travail d'âne –

Répondre

7

Eh bien, vous pouvez utiliser LINQ et faire

Dictionary<string, string> ini = (from entry in splitCache 
            let key = entry.Substring(0, entry.FirstIndexOf("=")) 
            let value = entry.Substring(entry.FirstIndexOf("=")) 
            select new { key, value }).ToDictionary(e => e.key, e => e.value); 

Comme Binary Worrier souligne dans les commentaires, cette façon de faire cela n'a aucun avantage sur la simple boucle proposée par les autres réponses.

Edit: Une version plus courte du bloc serait au-dessus de

Dictionary<string, string> ini = splitCache.ToDictionary(
            entry => entry.Substring(0, entry.FirstIndexOf("="), 
            entry => entry.Substring(entry.FirstIndexOf("=")); 
+1

@ pm_2. Sachez que cela cache simplement une boucle très simple sous un linq assez moche. +1 pour répondre à la question posée, mais je préfère la boucle. –

+0

Outre le problème évident de lisibilité, y a-t-il d'autres inconvénients à utiliser cette méthode? –

+0

@ pm_2: Vous ne pouvez pas parcourir les expressions LINQ à l'aide du débogueur. A part ça, je n'en connais pas. – Jens

0

Pourquoi ne pas lire le fichier sous forme de lignes séparées, puis boucle diviser sur eux le premier =?

var dict = new Dictionary<string,string>(); 
foreach (var line in File.ReadAllLines(filename)) { 
    var parts = line.Split('=', 2); // Maximum of 2 parts, so '=' in value ignored. 
    dict.Add(parts[0], parts[1]); 
} 

(Dans .NET 4 remplacer ReadAllLines avec ReadLines, pour éviter de créer le tableau, ReadLines et retours IEnumerable<String> lit le fichier paresseusement.)

+1

devrait être 'dict.Add (parties [0], parties [1]);', ne devrait-il pas? – ZombieSheep

+0

@ZombieSheep: Bien sûr, il devrait :-) Corrigé. – Richard

4

Quel est le problème avec itérer?

var lines = File.ReadAllLines("pathtoyourfile.ini"); 
var dict = new Dictionary<string, string>(); 

foreach(var s in lines) 
{ 
    var split = s.Split("="); 
    dict.Add(split[0], split[1]); 
} 
3

Il y a en fait une API Windows pour la lecture/écriture de fichiers INI dans kernel32.dll; voir this CodeProject article pour un exemple.

1

Essayez comme ça

[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")] 

public static extern int GetPrivateProfileString(string SectionName, string KeyName, string Default, StringBuilder Return_StringBuilder_Name, int Size, string FileName); 

et appeler la fonction comme celui-ci

GetPrivateProfileString(Section_Name, "SETTING", "0", StringBuilder_Name, 10, "filename.ini"); 

Value est accessible à partir StringBuilder_Name.

1

Les fichiers INI sont un peu compliqués, donc je ne recommanderais pas de rouler les vôtres. J'ai écrit Nini qui est une bibliothèque de configuration includes un analyseur très rapide.

Sample file INI:

; This is a comment 
[My Section] 
key 1 = value 1 
key 2 = value 2 

[Pets] 
dog = rover 
cat = muffy 

Même code C#:

// Load the file 
IniDocument doc = new IniDocument ("test.ini"); 

// Print the data from the keys 
Console.WriteLine ("Key 1: " + doc.Get ("My Section", "key 1")); 
Console.WriteLine ("Key 2: " + doc.Get ("Pets", "dog")); 

// Create a new section 
doc.SetSection ("Movies"); 

// Set new values in the section 
doc.SetKey ("Movies", "horror", "Scream"); 
doc.SetKey ("Movies", "comedy", "Dumb and Dumber"); 

// Remove a section or values from a section 
doc.RemoveSection ("My Section"); 
doc.RemoveKey ("Pets", "dog"); 

// Save the changes 
doc.Save("test.ini"); 
+1

Nice et certainement utile pour toutes les utilisations non-triviales de fichiers ini. –