J’essaie de lire un fichier ini au format suivant:
SETTING=VALUE SETTING2=VALUE2
J’ai actuellement le code suivant:
ssortingng cache = sr.ReadToEnd(); ssortingng[] splitCache = cache.Split(new ssortingng[] {"\n", "\r\n"}, SsortingngSplitOptions.RemoveEmptyEnsortinges);
Ce qui me donne une liste de parameters, cependant, ce que je voudrais faire est de le lire dans un dictionnaire. Ma question est la suivante: y a-t-il un moyen de faire cela sans parcourir le tableau en entier et remplir manuellement le dictionnaire?
Eh bien, vous pouvez utiliser LINQ et faire
Dictionary ini = (from entry in splitCache let key = entry.Subssortingng(0, entry.FirstIndexOf("=")) let value = entry.Subssortingng(entry.FirstIndexOf("=")) select new { key, value }).ToDictionary(e => e.key, e => e.value);
Comme le souligne Binary Worrier dans les commentaires, cette façon de faire n’a aucun avantage par rapport à la simple boucle suggérée par les autres réponses.
Edit: Une version plus courte du bloc ci-dessus serait
Dictionary ini = splitCache.ToDictionary( entry => entry.Subssortingng(0, entry.FirstIndexOf("="), entry => entry.Subssortingng(entry.FirstIndexOf("="));
Quel est le problème avec itérer?
var lines = File.ReadAllLines("pathtoyourfile.ini"); var dict = new Dictionary(); foreach(var s in lines) { var split = s.Split("="); dict.Add(split[0], split[1]); }
Il y a en fait une API Windows pour lire / écrire des fichiers INI dans kernel32.dll
; voir cet article CodeProject pour un exemple.
Les fichiers INI sont un peu délicats, je vous déconseille donc de les lancer vous-même. J’ai écrit Nini qui est une bibliothèque de configuration qui inclut un parsingur syntaxique très rapide.
Exemple de fichier 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");
Essayez comme ça
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSsortingng")] public static extern int GetPrivateProfileSsortingng(ssortingng SectionName, ssortingng KeyName, ssortingng Default, SsortingngBuilder Return_SsortingngBuilder_Name, int Size, ssortingng FileName);
et appeler la fonction comme ça
GetPrivateProfileSsortingng(Section_Name, "SETTING", "0", SsortingngBuilder_Name, 10, "filename.ini");
La valeur est accessible à partir de SsortingngBuilder_Name
.
Pourquoi ne pas lire le fichier sous forme de lignes séparées, puis boucler dessus en séparant le premier =
?
var dict = new Dictionary(); 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, remplacez ReadAllLines
par ReadLines
. Pour éviter de créer le tableau, ReadLines
renvoie IEnumerable
et lit le fichier paresseusement.)