Ini-Dateien - Lesen Sie Multi-Linien?
Ich bin mir bewusst, dass Ini-Dateien gemeint sind, für die einzelnen Zeilen der Informationen, unnötig zu sagen, ich bin versucht zu Lesen/schreiben, die multi-Linien, die zu und von den Ini - ohne viel Erfolg (ich habe immer scheinen zu tun, Dinge auf die harte Weise!)
Können sagen, dass meine Ini-Datei gespeichert, die wie folgt aussieht:
[richardmarx]
Filenames=hazard
children of the night
right here waiting
Nehme an, dass die Ini-Datei wird dynamisch erstellt (dh, die richardmarx und die Dateinamen nicht kenne, aber einzigartig - Sie könnte buchstäblich alles sein).
Wie würde ich in der Lage sein zu Lesen der Ini-Datei?
In diesem Beispiel wird dann, wie könnte ich setzen richardmarx in ein TEdit, und die Dateinamen, die im Zusammenhang mit richardmarx Abschnitt in ein memo?
Vielen Dank im Voraus.
- Ini-Dateien sind gut für viele Dinge, aber ich würde sagen, dass multi-line-text, ist ein Schritt zu weit. Ich würde es vorziehen, verwenden Sie ein stärker strukturiertes format wie XML oder YAML oder JSON.
- möglich, Duplikat der Lesen Inidatei zu Stringlist problem, das Leerzeichen-problem
- mögliche Duplikate von Delphi: Wie Zeilenumbrüche in einer ini-Datei?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht speichern, multi-line-strings in eine INI-Datei zu beginnen. Entkommen, die Zeilenumbrüche, wie @RobertFrank vorgeschlagen. Ich würde nicht mit einem asterik für, dass, obwohl, als dass ein gültiges Zeichen. Ich würde so etwas wie dies:
Können Sie dann Lesen Sie die Zeichenfolge und ersetzen Sie die
%n
Sequenzen mit dem Wert dersLineBreak
Globale variable. Wenn Sie brauchen, zu speichern, eine tatsächliche%
Charakter, Flucht er, als%%
, zB:Filenames=Value1#13Value2#13Value3
, und wäre nicht die#13
dem gleichen Zweck dienen?#13
dient dem gleichen Zweck wie%n
, so lange wie Sie können analysieren, wenn nötig.#13
, dann ist dein editor ist die Codierung für die Anzeige Zwecke. Das ist nicht das gleiche wie die Speicherung von kodierten Sequenzen die Daten der Datei selbst, das ist das, was ich beschrieb. Codierung wäre erforderlich, wenn Sie verwenden standard-APIs zum Lesen der INI-Datei Daten.FileNames=
), und zwei weitere Zeilen text . Wo siehst du encoding es? Kopieren und fügen Sie den text in den Delphi-editor oder Notepad, und es scheint, als vier Linien von text. Da ist in der Tat ein Zeilenumbruch (unabhängig davon, ob es die #13 oder #10 oder #13#10 pair, es ist schon das bekommen, was Sie fordern eine "Flucht".TStringList
kümmern ändern Sie die CR/LF in einer einzigen #13 Zeichen, und auch trennt Sie in einzelne Linien in derStrings
Eigenschaft. Also keine manuelle Analyse zu finden "Flucht" benötigt werden. Das hinzufügen der "Flucht" würde Sie zwingen, dies zu tun. Aber all das ist irrelevant - ich denke, wir müssen uns nur einig, uneinig zu sein über diese. 🙂TIniFile
/TMemIniFile
oder direkte Win32-Profil-API), Zeilenumbrüche innerhalb der Werte kodiert werden. Das ist alles was ich sagen wollte.Du bist nicht mit einer gültigen
.ini
- format, so dass es nicht leicht werden wird. Es ist viel einfacher, wenn Sie verwenden Sie ein ordnungsgemäß gebildet.ini
Datei.Einen gültigen
ini
- Datei ist das formatHier ist ein Beispiel das Lesen mehrerer Zeilen aus einer ini-Datei. Während es verwendet eine
TListBox
statt einerTEdit
sollte es genug sein, zum du zu erhalten begannen.Den code unten funktioniert mit eine falsch formatierte Datei als gut, aber Sie werden wahrscheinlich haben, ändern Sie den code in der
ListBox1Click
Ereignis zu verwendenReadSectionValues
statt und machen ein paar händische Analyse für jedes Element, bevor er Sie anzeigt; in diesem Fall erstellen Sie eine weitereTStringList
in den event-handler übergeben und stattMemo1.Lines
.Richtig formatiert
ini
- Datei, die Sie verwenden könnenTIniFile.ReadSection
oderTMemIniFile.ReadSections
laden alle Abschnitte in einemTStrings
Nachkomme, und verwenden Sie dannReadSection(SectionName)
zu bekommen, jeden Abschnitt die Werte.Hier ist ein Beispiel - speichern Sie diese
ini
Datei irgendwo (ich habed:\temp\sample.ini
:Hier ist ein Beispiel des Formulars code:
Anklicken der einzelnen Namen in der
ListBox
zeigt die Elemente an, die in diesem Abschnitt, wie unten gesehen:EDIT: OK. Ich wurde neugierig zu sehen, wie es funktionieren würde mit der ini-Datei Inhalt, den Sie veröffentlicht in Ihrer Frage.
Also machte ich die folgende änderung:
Sample.ini
ich oben erstellt.Lief der code, und klickte auf die neue
richardmarx
Element. Hier ist, was ich habe:Offensichtlich, dass es nicht funktionieren würde. Also machte ich die folgenden zusätzlichen änderungen:
ListBox1Click
Ereignis zu verwendenFIni.ReadSectionValues
stattReadSection
.C Section
Element zu sehen, wie es angezeigt wird, und dann die neuerichardmarx
Element zu sehen, wie es angezeigt wird. Die Ergebnisse sind wie folgt:Pre-Prozess den .ini-Datei! Ändern, alle Zeilenumbrüche zwischen ] und [ einige Zeichen, die nie erscheinen im Dateinamen (wie asterisk). Dann TInifile verwenden, um den Zugriff auf die Datei, die Sie gerade vorverarbeitet, ändern die Sterne zurück, um Zeilenumbrüche nach abrufen der Saiten. (Verwenden Sie StringReplace)
Es ist ein wenig komplizierter als das, wenn Sie mehr als ein Identifikator in einem Abschnitt. In diesem Fall könnten Sie die ist-gleich-Zeichen als flag, dass die vorhergehenden Zeilenumbruch nicht entfernt werden sollten. Vielleicht liest du die Datei vom Ende in Richtung Anfang.
Könnte man sogar ein Nachkomme von TIniFile, die den astrerisk-zu-linebreak für Sie ändern.
Nein, dies ist sicherlich keine elegante Lösung. Aber, manchmal brute-force-wie das funktioniert, wenn Sie stecken! Die anderen Lösungen hier sind wahrscheinlich besser, aber dachte, ich würde teilen diese sowieso in den Fall gibt Ihnen eine Richtung zu denken, Position...
chr(0)
könnte eine gute Wahl für die Sonderzeichen!Mit jedem TStrings Nachkomme Objekt, können Sie einfach die CommaText - Eigenschaft Lesen und schreiben, die Zeilen als einzelne Zeichenfolge.
und
CommaText ist smart genug, um Linien mit den Kommas automatisch umarmt Sie in Anführungszeichen gesetzt werden.
dieser code zeigt, wie Sie zum schreiben und Lesen von multi-Linien, mit INI-Datei
Ich wollte etwas ähnliches, enthalten die Körper eine automatisierte E-Mail in der ini-Datei.
Aber ich wollte auch leere Zeilen in den Körper. Hier ist ein Teil der ini-Datei
Hier ist, was ich am Ende tun
@Ken Weiß
FIni.ReadSectionValues erhalten einen full-string nach dem gleichen Schlüssel, wie "Schlüssel=Wert".
In .ini wie
und nach
Memo1.Linien werden {'Item1=Artikel B1', 'Element4=Item B4'}
Leider, wir können nicht Lesen die Werte direkt, ohne Schlüssel.
Aber in der Tat, es ist nicht allzu schwierig:
Memo1.Linien wäre {'Element B1', 'Item B4'}
Oberen Methode liest alle Werte im Abschnitt, ohne Schlüssel.
Wie zu Lesen, nicht-kodierte Werte - ich weiß nicht (wenn überhaupt möglich in .ini).
Als Lösung für die großen nicht-format .ini, nur folgerichtig, alle Saiten - Lesen-Datei wie eine Textdatei, zu finden benötigt-Abschnitt, und fügen Sie gleichen count-index wie ein Schlüssel, der schematisch(!):
Wenn notwendig gemischt-format, erfordern mehr komplizierte parser.
P. S. Sorry für mein Englisch, ich bin nicht stark in ihm.
Können Sie ReadSections Methode, um alle Sektionsnamen in der ini-Datei.
Und vielleicht können Sie TMemIniFile ist ReadSectionValues Methode zum Lesen "multiline-Werte" (D. H. zu Lesen ganzer Abschnitt in stringlist). Wenn das nicht funktioniert, dann vielleicht könnten Sie GetStrings auf, um den Inhalt der ini-Datei und parse es "semy manuell" - IIRC gibt es Ihnen eine stringlist mit Namen Abschnitt, wo jedes Element-Objekt enthält ein anderes stringlist mit Abschnitt Daten.