| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | NVIDIA GTC Paris und ISC High Performance-Konferenz 2025, eine Pressemitteilung
|
Autor
|
Thema: Werte in csv-Datei schreiben (3121 mal gelesen)
|
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 02. Feb. 2007 11:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo liebe Leute, für eine Anwendung unter VBA 6 suche ich einen Code, mit dem es möglich sein soll, den Wert einer Variablen gezielt in ein bestimmtes (leeres) Datenfelder einer bestehenden csv-Datei (attachment) zu schrieben und anschließend zu speichern. Als Seperatoren sollen Semikolons verwendet werden und das ganz muss ohne Excel möglich sein. Vielen Dank Uwe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 02. Feb. 2007 12:39 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
Hallo Uwe, eigentlich ist es fast ein Umkehr zum Einlesen oder so
Code: Sub test() Dim fso As New FileSystemObject Dim DateiName As String Dim BakName As String Dim Quelle As TextStream Dim Ziel As TextStream Dim Zeile As String Dim Reihe As Long Dim ZielReihe As Long Dim Spalte As Long Dim ZielSpalte As Long Dim NeuerWert As String Dim Spalten As Variant Dim i As Long DateiName = "C:\temp\FEM_CAD_2.txt" BakName = fso.GetBaseName(DateiName) & ".BAK" ZielReihe = 5 ZielSpalte = 2 NeuerWert = "TEST" fso.MoveFile DateiName, BakName Set Quelle = fso.OpenTextFile(BakName, ForReading) Set Ziel = fso.OpenTextFile(DateiName, ForWriting, True) While Not Quelle.AtEndOfStream Reihe = Reihe + 1 Zeile = Quelle.ReadLine If Reihe = ZielReihe Then Spalten = Split(Zeile, ";") Spalten(ZielSpalte) = NeuerWert For i = 0 To UBound(Spalten) Ziel.Write Spalten(i) & ";" Next i Ziel.Write vbCrLf Else Ziel.WriteLine Zeile End If Wend Ziel.Close Quelle.Close End Sub
Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 02. Feb. 2007 16:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, dank Dir für Deine Antwort, aber das Sub läuft bei mir leider gar nicht. Die Datentypen "FileSystemObject" und "TextStream" scheinen nicht bekannt zu sein, so dass er an dieser Stelle den Prozess schon abbricht. Kann es sein, dass diese Typen erst in späteren Versionen als AutoCAD 2002 hinzugekommen sind? Danke
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002 AutoCAD ACA 2024 Solidworks 2022 Sp5 Enterprise PDM 2022 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell Precision 3660 Intel Core i9-12900K 32 GB Arbeitsspeicher 2x Dell U2415
|
erstellt am: 02. Feb. 2007 17:59 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
|
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 02. Feb. 2007 18:16 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
|
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 02. Feb. 2007 18:23 <-- editieren / zitieren --> Unities abgeben:         
Hallo Carsten, dank Dir, echt super. Und trotz alledem noch eine letzte Frage. Wennn ich das sub jetzt als Schleife durchlaufen lassen will, so dass er das nächste mal an eine andere Position einen Wert schreibt - kommt die Meldung "Datei existiert bereits" - was müsste man diesbezüglich ändern? Vielen Dank Uwe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 02. Feb. 2007 18:42 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
|
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 02. Feb. 2007 18:47 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
Hallo Uwe, mir ist noch aufgefallen das du eine Stelle noch einfacher hinbekommst
Code: ''' ALT Spalten(ZielSpalte) = NeuerWert For i = 0 To UBound(Spalten) Ziel.Write Spalten(i) & ";" Next i Ziel.Write vbCrLf''' Neu Spalten(ZielSpalte) = NeuerWert Ziel.WriteLine Join(Spalten,";")
Stelli
------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 02. Feb. 2007 18:48 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
|
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 02. Feb. 2007 19:26 <-- editieren / zitieren --> Unities abgeben:         
Prima, es lag an der .bak Datei. Nach dem sie gelöscht ist läuft das Sub wieder. Was jedoch nicht ganz einleuchtet ist, warum er die .bak in ein ganz anderes Verzeichnis schreibt - nach meinem Dafürhalten - eines welches gar nichts mit AutoCad bzw. der Datei zu tun hat. Habt Ihr da eine Antwort zu. Danke Uwe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 02. Feb. 2007 19:35 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli und Carsten, habe den Rechner neu gestartet und jetzt schreibt er die Bak in's AutoCad Verzeichnis - macht jetzt alles wieder Sinn. Also vielen Dank an Euch beide für Eure Hilfe. Gruß Uwe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 25. Feb. 2007 09:52 <-- editieren / zitieren --> Unities abgeben:         
Hallo liebe Leute, bzgl. des auch schon oben stehenden Sub’s würde ich gerne, dass dieses Sub mehrfach per Schleife durchlaufen werden kann und sich die Zeilen bzw. Spalten, also die Datenfelder in die geschrieben werden sollen, ändern. Nun wird die Schleife zwar entsprechend oft durchlaufen, aber es wird nur der erste Wert „2“ in das zuerst festgelegte Datenfeld „9, 3“ geschrieben. Wieso ist das so, und wie müsste das Sub aussehen, damit auch die anderen Werte entsprechend in der csv-Datei platziert werden? Vielleicht gibt es auch noch eine andere Variante entsprechende Werte in bestehende CSV-Dateien zu schreiben? Vielen Dank -Uwe Sub test() Dim Datei As String Dim fso As New FileSystemObject Dim DateiName As String Dim BakName As String Dim Quelle As TextStream Dim Ziel As TextStream Dim Zeile As String Dim Reihe As Long Dim ZielReihe As Long Dim Spalte As Long Dim ZielSpalte As Long Dim NeuerWert As Integer Dim Spalten As Variant Dim i As Long Dim g As Long For g = 2 To 12 'Prüft ob eine bak vorhanden ist und wenn loescht sie dann------------ Datei = "C:\Programme\AutoCAD 2002 Deu\ERG_VT_ID.bak" Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists(Datei) Then Datei = "C:\Programme\AutoCAD 2002 Deu\ERG_VT_ID.bak" Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists(Datei) Then fso.DeleteFile Datei, True End If End If DateiName = "C:\temp\ERG_VT_ID.csv" BakName = fso.GetBaseName(DateiName) & ".BAK" ZielReihe = g + 1 ZielSpalte = 9 NeuerWert = g fso.MoveFile DateiName, BakName Set Quelle = fso.OpenTextFile(BakName, ForReading) Set Ziel = fso.OpenTextFile(DateiName, ForWriting, True) While Not Quelle.AtEndOfStream Reihe = Reihe + 1 Zeile = Quelle.ReadLine If Reihe = ZielReihe Then Spalten = Split(Zeile, ";") Spalten(ZielSpalte) = NeuerWert Ziel.WriteLine Join(Spalten, ";") Else Ziel.WriteLine Zeile End If Wend Ziel.Close Quelle.Close Next g End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Feb. 2007 12:59 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
Hallo Uwe, erstmal scheint mir das du da etwas mit den Dateien durcheinander bist. Wo soll denn das Ergebnis rein ? Datei = "C:\Programme\AutoCAD 2002 Deu\ERG_VT_ID.bak oder DateiName = "C:\temp\ERG_VT_ID.csv" Eigentlich kann das so nicht laufen. Code:
....... ''Datei = "C:\Programme\AutoCAD 2002 Deu\ERG_VT_ID.bak" Set fso = CreateObject("Scripting.FileSystemObject") ''If fso.FileExists(Datei) Then '' Datei = "C:\Programme\AutoCAD 2002 Deu\ERG_VT_ID.bak" '' Set fso = CreateObject("Scripting.FileSystemObject") ''If fso.FileExists(Datei) Then '' fso.DeleteFile Datei, True ''End If ''End If DateiName = "C:\temp\ERG_VT_ID.csv" BakName = fso.GetBaseName(DateiName) & ".BAK" ' Wenn es schon eine Bak gibt dann löschen If fso.FileExists(BakName) Then fso.deleteFile BakName, True end if ' Orginaldatei nach Bak Datei fso.MoveFile DateiName, BakName ZielReihe = g + 1 ZielSpalte = 9 NeuerWert = g Set Quelle = fso.OpenTextFile(BakName, ForReading) Set Ziel = fso.OpenTextFile(DateiName, ForWriting, True) While Not Quelle.AtEndOfStream ....
Wenn du jedoch eine komplette Spalte ändern willst brauchst du nicht 12 mal die Datei löschen, kopieren, lesen, schreiben ... sondern kannst das doch in einem Rutsch machen. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 25. Feb. 2007 14:12 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, das Ergebnis soll in die „DateiName = "C:\temp\ERG_VT_ID.csv"“, die Bak-Datei ist mir eigentlich unwichtig. Was jedoch wichtig ist, ist das die Zieldatei, also die CSV-Datei, mehrfach während des Programmablaufes beschrieben werden kann - geöffnet und geschlossen – nach / vor jeder neuen Schleife. Z.B.: Datei öffnen, 3 Felder einer Spalte (je nach Schleifengröße) beschreiben, dann Datei speichern und schließen. Zu einem späteren Zeitpunkt ist der entsprechende Code wieder im Programm implementiert und es soll die CSV wieder beschrieben werden. Dann z.B. 5 andere Felder beschreiben, speichern und schließen. Die zuvor geschriebenen Datenfelder sollen erhalten bleiben. Nach so etwas suche ich. Wenn Du mir da mit einem Code weiterhelfen könntest wäre das prima. Da wie gesagt immer nur der erste Wert der Schleife in das erste Feld geschrieben wir und dann ist Schluss. Viele Grüße und Danke Uwe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stagladasy Mitglied Ingenieur

 Beiträge: 21 Registriert: 02.01.2007
|
erstellt am: 25. Feb. 2007 18:25 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, habe da jetzt eine kleine Ewigkeit daran umhergebastelt mit Deinem letzten und mit meinem alten Code, aber er schreibt weiterhin ausschließlich nur den ersten Wert (in die .bak im AutoCAD Verzeichnis als auch in der .csv unter Temp). Die Schleife wird zwar ordentlich durchlaufen, aber das war auch schon alles. Irgendwie komm ich nicht weiter. Wäre für Hilfe dankbar. Uwe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 27. Feb. 2007 21:30 <-- editieren / zitieren --> Unities abgeben:          Nur für Stagladasy
Hallo Uwe, hab dir mal ein Beispiel gemacht wie ich es anfangen würde. Hab mal ein paar Fehlerabfragen reingebaut, aber ein wenig musst du ja auch noch zu tun haben. Code:
''' in ein Modul Public mycsv As cls_CSV Sub test() Dim i As Integer Set mycsv = New cls_CSV If Not mycsv.OpenFile("C:\TEMP\TEST.txt") Then MsgBox mycsv.ErrMessage Exit Sub End If For i = 2 To mycsv.Rows mycsv.SetValue i, 3, "TEST2" Next i If mycsv.UnSaved Then mycsv.SaveFile End If End Sub Sub mycsv_FileNotExist(Datei As String, Msg As String) Stop End Sub ''' In ein Klassenmodul ''' Dieses muss den Namen CLS_CSV haben Private Zeilen As Variant Private Spalten As Variant Private FSO As FileSystemObject Private TextStream As TextStream Private GeöffneteDatei As String Public UnSaved As Boolean Public ErrMessage As String Public Rows As Long Public Function OpenFile(Datei As String) As Boolean Dim Inhalt As String If FSO.FileExists(Datei) = False Then ErrMessage = Datei & " nicht gefunden" Exit Function End If ' Textdatei öffnen Set TextStream = FSO.OpenTextFile(Datei, ForReading) ' Textdatei lesen Inhalt = TextStream.ReadAll ' In Zeilen abfüllen Zeilen = Split(Inhalt, vbCrLf) TextStream.Close ' Zeilen ermitteln Rows = UBound(Zeilen) ' Dateiname merken GeöffneteDatei = Datei UnSaved = False OpenFile = True End Function Public Function SetValue(ByVal Row As Long, ByVal Col As Long, ByVal Value As String) As Boolean ' Zeilen und Spalten sin 0 basierte Arrays Spalten = Split(Zeilen(Row - 1), ";") If Row > UBound(Zeilen) + 1 Then ' Alternativ können jetzt aber auch Zeilen angelegt werden ' um die Datei zu erweitern ErrMessage = "Zeilenangabe ungültig" Exit Function End If If Row < 1 Then ErrMessage = "Nur Zeilen grösser 0 erlaubt!" Exit Function End If If Col > UBound(Spalten) + 1 Then ErrMessage = "Spaltenangeb zu groß" Exit Function End If ' Werte vergleichen If Spalten(Col - 1) <> Value Then UnSaved = True End If ' Wert in die Spalte Spalten(Col - 1) = Value ' Wieder zur Zeile bauen Zeilen(Row - 1) = Join(Spalten, ";") SetValue = True End Function Public Function SaveFile(Optional Datei As String) As Boolean If IsMissing(Datei) = True Or Datei = "" Then Datei = GeöffneteDatei End If If Datei = "" Then ' Keine Angabe. Speichern nich möglich Exit Function End If Set TextStream = FSO.OpenTextFile(Datei, ForWriting, True) ' Inhalt zusammenbauen Inhalt = Join(Zeilen, vbCrLf) TextStream.Write Inhalt TextStream.Close UnSaved = False End Function Private Sub Class_Initialize() Set FSO = New FileSystemObject End Sub
Stelli PS: den Verweis auf Scipting Runtime nicht vergessen ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |