PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Visual Basic 2010 INI Werte in Datenfeld laden.


Geldmann3
2012-08-24, 02:27:42
Hallo, hat jemand eine Idee, wie ich die Werte aus einer INI Datei in Visual Basic 2010 in ein zweidimensionales Datenfeld laden kann?

Die Textdatei hat folgende Struktur
Super = Toll
33 = 3&3
URL = http://www.forum-3dcenter.org
Ich kann nicht sagen, wie viele Zeilen die Textdatei hat.
Die Struktur der Datei selbst würde ich ungern ändern. Sie wird laufend aktualisiert.

Das Datenfeld sollte in etwa so aussehen.
- - - - 1 - - - - 2
1 - - Super - - Toll
2 - - 33 - - 3&3
3 - - URL - - http://www.forum-3dcenter.org

MSGBox((Datenfeld(2, 1))
Sollte dann "Toll" ausgeben.

Aber wie bekomme ich die Daten aus der INI Datei am besten in das Datenfeld?
Ich könnte die Datei irgendwie Zeilenweise auslesen.
Doch ich habe ja 2 Werte in einer Reihe vor und nach dem "=".
Das müsste ich ja irgendwie noch auseinender setzen.

Wie würdet ihr das machen? Jede Zeile erst in eine Variable? Oder erst mal ein anderes Array was dann bearbeitet wird? Oder geht es noch besser?


Danke

Marscel
2012-08-24, 03:49:46
Aber wie bekomme ich die Daten aus der INI Datei am besten in das Datenfeld?
Ich könnte die Datei irgendwie Zeilenweise auslesen.
Doch ich habe ja 2 Werte in einer Reihe vor und nach dem "=".
Das müsste ich ja irgendwie noch auseinender setzen.

Wie würdet ihr das machen? Jede Zeile erst in eine Variable? Oder erst mal ein anderes Array was dann bearbeitet wird? Oder geht es noch besser?

Warum machst du dir da soviele Gedanken drum? Einerseits, wenn du Google benutzt, wirst du feststellen, dass du nicht der erste bist, der INI-Dateien auslesen möchte. Aber das wär ja zu einfach.

Andererseits, lies den Kram doch einfach ein und gut, für sowas braucht man keinen Schönheitswettbewerb anfangen. System.IO.File (http://msdn.microsoft.com/en-us/library/system.io.file(v=vs.90).aspx), System.String (http://msdn.microsoft.com/en-us/library/system.string(v=vs.90).aspx) und wohlmöglich Dictionary (http://msdn.microsoft.com/de-de/library/xfhwa508(v=vs.90).aspx) sind deine Freunde.

Btw., VB10 ist doch .NET v4, da kannst du kriegst du sogar noch mehr Komfortfeatures aufgelistet, wenn du du die Doku umstellst.

Geldmann3
2012-08-24, 07:29:06
Danke für die Tipps, das Internet ist sehr groß ich finde sicher noch die ein oder andere Information und bin auch ständig gewillt mich weiterzubilden, doch man kennt das ja, die Zeit ist oft etwas knapp. Ich bin genau wie von dir vermutet nicht der Erste der eine INI Datei auslesen möchte, habe auch schon diverse Erfahrungen mit der Windows API zu diesem Thema gemacht, leider scheint mein Problem zu spezifisch zu sein, als dass Google mir auf die Schnelle weiterhelfen könnte.

Es stellt für mich kein Problem dar, einen Schlüssel anzugeben und den dazugehörigen Wert auszulesen. Dank API. Doch kenne ich keine solche Möglichkeit Werte für Schlüssel auszulesen, deren Namen mir nichtmal bekannt sind. Wie den Wert für Schlüssel "Nr.61". Vielleicht kenne ich diese Möglichkeit nur nicht.... Oder ich muss wirklich wieder aus der API raus und mich mit String-Zerlegung befassen...
Was ich wohl auch packen sollte...(Umständlich)
Btw., VB10 ist doch .NET v4, da kannst du kriegst du sogar noch mehr Komfortfeatures aufgelistet, wenn du du die Doku umstellst.
??? Doku umstellen?

Winnie
2012-08-24, 09:24:08
Ich kenne mich ja so ziemlich null mit VB aus...aber kannst du nicht einfach ein Array dimensionieren, die Ini-Datei zeilenweise auslesen, nen Stringsplit machen, die beiden Werte trimmen und ins Array schreiben und dann das Array vergrössern? Kann doch nicht so schwer sein :-)

Gohan
2012-08-24, 09:38:20
Also ganz unabhängig von VB, so würde man es in jeder beliebigen Sprache machen, wenn man etwas nachdenkt:


Datei einlesen
Über jede Zeile iterieren
String mit "=" splitten und von Leerzeichen bereinigen
Den ersten Teil des Strings als Key, den zweiten Teil as Value verwenden und z.B. in ein Array oder Dictionary (Generisch (Of String, String) in VB z.B.) speichern


Ist das so schwer?

Marscel
2012-08-24, 14:23:58
??? Doku umstellen?

Ich hatte die Klassendokumentation für .NET v3.5 verlinkt. Da du wahrscheinlich die Defaulteinstellung, also v4.0 verwendest, solltest du dir die Klassen auch jeweils dafür angucken: "Other Versions" anklicken und umstellen.

Monger
2012-08-25, 00:59:37
Was Gohan beschreibt, ist die 80% Lösung die in 95% aller Fälle ausreichend sein sollte.
Ini Dateien können leider viel komplexer sein: mit unterschiedlichen Sektionen, die auch identische Schlüssel enthalten dürfen. Mit beliebig vielen führenden oder folgenden Leerzeichen, sowie Escape Charakteren wie z.B. Anführungszeichen... das ist schlecht bzw. gar nicht standardisiert.

Das ist jetzt so ein Grenzfall, wo String.Split bzw. String.Trim etc. wahrscheinlich noch ausreichend sind.
Aber wenn ich dir einen Rat geben darf: fang an, dich mal mit regulären Ausdrücken zu beschäftigen. Die dazu nötige Klasse findest du unter System.Text.RegularExpressions.Regex , und als Webseite zum Lernen und als Referenz empfehle ich www.Regular-Expressions.info

So habe ich selbst Reguläre Ausdrücke gelernt. Auch wenn das am Anfang erst etwas wie Overkill wirkt: sowas lässt sich dann mit Regex sehr simpel erschlagen.


Dim dict = new Dictionary(of String, String)
For Each line in IO.File.ReadLines(MyIniFile)
Dim m = Regex.Match(line, "(\w+)\s*=\s*(\w+)")
if m.Success Then dict.Add(m.Groups(1).Value, m.Groups(2).Value)
Next

RattuS
2012-08-25, 01:16:27
public class MyIniPair {
public string key { get; set; }
public string column { get; set; }
}

private ArrayList ReadIni(string iniFile) {

ArrayList myIniArray = new ArrayList();

try {

using (StreamReader reader = new StreamReader(iniFile)) {

while (!reader.eof) {
string[] lineParts = split(fileStream.ReadLine(), "=");
if (lineParts.Length >= 2) {
myIniArray.Add(new MyIniPair { key = lineParts[0].Trim(), column = lineParts[1].Trim() });
}
}

}

}
catch (Exception e) {
// whatever
}

return myIniArray;

}

Und jetzt kannst du entweder dein Array via Index referenzieren:

ArrayList myIniArray= ReadIni("myfile.ini");

if (myIniArray.Count > 0) {
var selection = myIniArray[0];
// MyIniPair:
// { key: "Super", column: "Toll" }
}

oder sogar mit Hilfe von LINQ nach jeglichen Einträgen im Array selektieren (d.h. du könntest auch mehrere Zeilen finden, falls vorhanden):

ArrayList myIniArray= ReadIni("myfile.ini");

if (myIniArray.Count > 0) {
var query = from myIniArray iniPair in myIniArray where iniPair.column == "Toll" select iniPair;
// MyIniPair[]:
// [0]: { key: "Super", column: "Toll" }
}

Syntax ohne Gewähr, hab das gerade blind geschrieben. Oh und ich merke gerade, dass du VB .NET nutzt. Na dann kannst du den Code auch fix von C# auf VB online umwandeln lassen: http://www.developerfusion.com/tools/convert/csharp-to-vb/