Autor
|
Thema: txt-file (Zeile bestimmen) (2025 mal gelesen)
|
newmann Mitglied
Beiträge: 18 Registriert: 15.08.2011
|
erstellt am: 06. Sep. 2011 08:31 <-- editieren / zitieren --> Unities abgeben:
Hi, habe ein kleines Problem und hoffe das mir jemand weiterhelfen kann. Ich möchte Informationen (Pfad, Position, etc.) welche ich vorher ermittelt habe in eine txt-file schreiben, da ich diese Datei für mehrere Informationen nutze möchte ich die Zeile im txt-file bestimmen wo die Information hingeschrieben werden sollen (nicht immer am Anfang). weiß jemand wie ich dies mache?? Zum Verständnis mein bsheriger Code: path = CATIA.SystemService.Environ("CATUSERSETTINGPATH") File = "Daten.txt" Bez = path & "\" & File Set Datei = CATIA.FileSystem.CreateFile(Bez, True) Set Bstream = Datei.OpenAsTextStream("ForWriting") Bzeile = "Daten" & ";" & pos_left & ";" & pos_top & ";" & Fenster & vbLf Bstream.Write Bzeile Bstream.Close Danke schon mal für eure Hilfe..... Gruß Matze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 06. Sep. 2011 09:02 <-- editieren / zitieren --> Unities abgeben: Nur für newmann
|
newmann Mitglied
Beiträge: 18 Registriert: 15.08.2011
|
erstellt am: 06. Sep. 2011 09:56 <-- editieren / zitieren --> Unities abgeben:
Hallo, Danke erstmal, ist aber nicht so ganz das was ich benötige :-( mit dem "Appending-Code" hänge ich an den bestehenden Code nur an. Leider aber wird immer angehängt, wenn z. B. in der 2.Zeile bereits etwas steht dann möchte ich den Text in der 2. Zeile überschreiben (ohne den Text in der 1. Zeile zu ändern und umgekehrt)und nicht als 3.Zeile dran hängen. Schließlich möchte ich später auch genau die Information aus der 2. Zeile auslesen. mit der ini-Datei kenne ich mich nicht so aus muß mich da erst "reinlesen" (und es verstehen). Habe versucht evtl. mit "Zeile = Split" etwas zu erreichen leider ohne Erfolg. gibt es vielleicht ne andere Möglichkeit das mit dem txt-file hinzubekommen?? Gruß Matze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 06. Sep. 2011 10:12 <-- editieren / zitieren --> Unities abgeben: Nur für newmann
Zitat: wenn z. B. in der 2.Zeile bereits etwas steht dann möchte ich den Text in der 2. Zeile überschreiben (ohne den Text in der 1. Zeile zu ändern und umgekehrt)und nicht als 3.Zeile dran hängen
dann müsstest du vor jedem schreiben einer zeile die komplette text-datei erstmal auslesen in einen string. dann den string an den "neuen Zeilen" splitten so dass du ein array erhälst mit den einzelnen zeilen als komponenten. array1 = split(string1, vbCrLf) oder sowas in der richtung. dann kannst du deine Zeile im array ersetzen mit array1(zeilennummer) = "whatever" und das ganze wieder in einem string zusammenfassen und in die datei schreiben. string2 = join(array1, vbCrLf) ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 06. Sep. 2011 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für newmann
kurz zu den ini's in einer ini gibt es Sections, Keys und Values. Eine Section kann beliebig viele Keys beinhalten, denen man Values, also Werte zuordnen kann. <Section1> Key1=Value1 Key2=Value2 ... <Section2> ... folgendes modul kannst du dir in dein vba projekt kopieren
Code:
'' DLL-Funktionen zum LESEN der INI deklarieren Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _ ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, _ ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer '' DLL-Funktion zum SCHREIBEN in die INI deklarieren Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, _ ByVal lpFileName As String) As Integer '' DLL-Funktion zum Löschen einer ganzen Sektion deklarieren Private Declare Function DeletePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ ByVal Section As String, ByVal NoKey As Integer, ByVal NoSetting As Integer, _ ByVal FileName As String) As Integer Public Function ReadValue(ByVal iSection As String, _ ByVal iKey As String, _ ByVal iPath As String, _ Optional ByVal iDefault As String = "", _ Optional ByVal iBufferSize As Integer = 1024) As String Dim sTemp As String sTemp = Space(iBufferSize) Dim Length As Integer Length = GetPrivateProfileString(iSection, iKey, iDefault, sTemp, iBufferSize, iPath) ReadValue = Left(sTemp, Length) End Function Public Sub WriteValue(ByVal iSection As String, ByVal iKey As String, ByVal iValue As String, ByVal iPath As String) ' Schreiben in die INI durchführen Call WritePrivateProfileString(iSection, iKey, iValue, iPath) End Sub Public Sub DeleteKey(ByVal iSection As String, ByVal iKey As String, ByVal iPath As String) ' Löschen des Schlüssels durch eine Schreiboperation durchführen Call WritePrivateProfileString(iSection, iKey, Nothing, iPath) End Sub Public Sub DeleteSection(ByVal iSection As String, ByVal iPath As String) Call DeletePrivateProfileSection(iSection, 0, 0, iPath) End Sub
mit dieser funktion kannst du das ganze testen.
Code: Sub test() Dim PathToINIFile As String ' Pfad zur INI Datei angeben PathToINIFile = "C:\test.ini" ' Wert in INI schreiben Call M_RW_INI.WriteValue("MeineSektion", "MeinKey", "MeinWert", PathToINIFile) MsgBox "wert wurde geschrieben" ' Wert wieder auslesen Dim wert As String wert = M_RW_INI.ReadValue("MeineSektion", "MeinKey", PathToINIFile) MsgBox wert End Sub
[Diese Nachricht wurde von meisterlumpi am 06. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
newmann Mitglied
Beiträge: 18 Registriert: 15.08.2011
|
erstellt am: 06. Sep. 2011 13:11 <-- editieren / zitieren --> Unities abgeben:
Hallo, also mit der "ini-Datei" kenne ich mich nicht so aus habe daher deinen Code genommen den "stumpf" kopiert um den Test durchlaufen zulassen und bin gleich auf einen Fehler gelaufen ( Zeile:Call M_RW_INI.WriteValue("MeineSektion", "MeinKey", "MeinWert", PathToINIFile). Wollte daher die Variante mit dem Array ausprobieren und bekomme die Zweite Zeile nicht ausgelesen. Habe einen txt-File (z. b. mit 2.Zeilen) 1.Zeile: Test;100;250;Basis; 2.Zeile: Test;150;230; High; ";" soll die Trennung für den späteren Split sein Quellcode: Set datei = CATIA.FileSystem.GetFile(uName) Set tstream = datei.OpenAsTextStream("ForReading") zeile = Split(tstream.ReadLine, ";") neu1 = zeile(0) neu2 = zeile(1) neu3 = zeile(2) neu4 = zeile(3) neu5 = zeile(4) neu6 = zeile(5) neu7 = zeile(6) neu8 = zeile(7) in "neu5" läuft er dann auf einen Fehler ("out of range"), da er die zweite Zeile nicht ausliest. Muß ich hier den Inhalt der txt-Datei anders abfragen?? Wenn ich alles in einer Zeile schreibe liest er mir alles aus also hat er wohl ein Problem mit dem Zeilenumbruch, oder?? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 06. Sep. 2011 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für newmann
|
newmann Mitglied
Beiträge: 18 Registriert: 15.08.2011
|
erstellt am: 07. Sep. 2011 08:27 <-- editieren / zitieren --> Unities abgeben:
Hallo, die Variante mit dem ersetzen von "line" in "All" hat nicht geklappt. Die g. Funktion ist super durchgelaufen (zeigt genau das was ich möchte) ich bekomme aber eine Fehlermeldung (objekt dequired) nach Ende des Funktionsdurchlaufes und Rückgabe an die "txtLine.Text" muß ich hier vorab erst eine Deklarierung durchführen?? Das mit der ini-Datei habe ich erstmal verdrängt (zu wenig Einblick wie das genau funktioniert). Es scheint ja auch so als wenn das mit der Funktion fast klappen würde, daher würde ich erstmal die txt-Variante weiter verfolgen. Wenn das nichts wird werde ich mich wohl mit dem "ini-Thema" befassen (müssen). Vielleicht kannst du mir ja bei der Fehlermeldung nach dem Funktionsende weiterhelfen..... Gruß Matze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 07. Sep. 2011 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für newmann
Das Element 'txtLine' musst du abändern. Mach dir einfach ne string variable und schreib die auszulesende Zeile da rein. Pfad anpassen nicht vergessen. Gruß Code:
Sub test() Dim Zeile as string Zeile = ReadLine("C:\.........\sample.txt", 1) ' <- PFAD ANPASSEN MsgBox Zeile End Sub ' Bestimmte Zeile aus einer Textdatei lesen Public Function ReadLine(ByVal sFile As String, _ Optional ByVal nLine As Long = 1) As String Dim sLines() As String Dim oFSO As Object Dim oFile As Object ' Fehlerbehandlung aktivieren On Error GoTo ErrHandler ' Verweis auf das FileSystemObject erstellen Set oFSO = CreateObject("Scripting.FileSystemObject") ' Existiert die Datei überhaupt? If oFSO.FileExists(sFile) Then ' Datei öffnen Set oFile = oFSO.OpenTextFile(sFile) ' Alles lesen und in Array zerlegen sLines = Split(oFile.ReadAll, vbCrLf) ' Datei schließen oFile.Close Select Case Sgn(nLine) ' (nLine > 0) Case 1 ' n-te Zeile von vorne beginnend ReadLine = sLines(nLine - 1) ' (nLine < 0) Case -1 ' n-te Zeile von hinten beginnend ReadLine = sLines(UBound(sLines) + nLine + 1) End Select End If ErrHandler: ' Objekte zerstören Set oFile = Nothing Set oFSO = Nothing End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
newmann Mitglied
Beiträge: 18 Registriert: 15.08.2011
|
erstellt am: 08. Sep. 2011 08:59 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|