Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Bestimmte Zeilen mit VBS in eine neue TXT Datei übernehmen

Frage Entwicklung VB for Applications

Mitglied: m.matt85

m.matt85 (Level 1) - Jetzt verbinden

21.06.2011 um 09:39 Uhr, 4590 Aufrufe, 7 Kommentare

Hallo an Alle,

ich habe folgendes Problem:

Eine Textdatei besteht aus mehreren Zeilen, ab einer Leerzeile beginnen die Datensätze die für mich wichtig sind.

Ich muss nun mit VBS ab der Leerzeile prüfen ob ein ; am Schluss steht oder nicht. Wenn ein ; am Schluss steht soll die Zeile gelöscht werden. Falls keines am Schluss steht soll die jeweilige Zeile außer dem letzten Wert übernomen werden.

z.B. xxxxxx - xxxxxxx;0.000;0.400;0.000;0.125;0.125

d.h. der Wert 0.125 muss gelöscht werden der Rest übernommen.

Habe mal was gefunden, weiß allerdings nicht ob mir der Befehl hier weiterhilft.

intPosRev = InStrRev(strText,",",20)

Kann mir da jemand weiterhelfen wie ich die Sache am Besten programmiere?
Wäre um jede Hilfe dankbar!
Grüße
Mitglied: bastla
21.06.2011 um 10:27 Uhr
Hallo m.matt85 und willkommen im Forum!

Etwa so:
01.
Ein = "D:\Text_alt.txt" 
02.
Aus = "D:\Text_neu.txt" 
03.
Delim = ";" 'Trennzeichen für Felder 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
'gesamten Text in Zeilen-Array einlesen 
07.
Zeilen = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf) 
08.
 
09.
'Ausgabedatei erzeugen 
10.
Set AusDatei = fso.CreateTextFile(Aus) 
11.
'Flag für "Sollen Zeilen ab jetzt geschrieben werden?" initialisieren 
12.
Schreiben = False 
13.
 
14.
'Schleife über alle Zeilen 
15.
For i = 0 To UBound(Zeilen) 
16.
    'Falls bereits geschrieben werden soll und die Zeile nicht mit dem Trennzeichen endet 
17.
    If Schreiben And Right(Zeilen(i), 1) <> Delim Then 
18.
        'Zeile anhand des Trennzeichens in ein Array "Felder" zerlegen 
19.
        Felder = Split(Zeilen(i), Delim) 
20.
        'Leerzeilen berücksichtigen 
21.
        If UBound(Felder) >= 0 Then 
22.
            'Inhalt des letzten Feldes löschen 
23.
            Felder(UBound(Felder)) = "" 
24.
            'Felder wieder (mit Trennzeichen) zu einer Zeile zusammenfügen 
25.
            AusZeile = Join(Felder, Delim) 
26.
            'Zeile in die Datei schreiben; dabei das überzählige Trennzeichen am Ende abschneiden 
27.
            AusDatei.WriteLine Left(AusZeile, Len(AusZeile) - 1) 
28.
        End If 
29.
    Else 
30.
        'Wenn Leerzeile gefunden, folgende Zeilen schreiben 
31.
        If Zeilen(i) = "" Then Schreiben = True 
32.
    End If 
33.
Next
Grüße
bastla
Bitte warten ..
Mitglied: m.matt85
21.06.2011 um 10:53 Uhr
Danke für deine schnelle Antwort und Hilfe!

Es passt soweit und funktioniert fast , das Programm sollte mir nur die Zeilen ausgeben bei denen ein Wert am Schluss steht, doch momentan werden mehrer Zeilen ausgegeben.

xxxxxx - xxxxxxx;0.000;0.400;0.000;0.125;0.125

Mit dem Programm steht die Zeile nun folgendermaßen in der neuen Datei:

xxxxxx - xxxxxxx;0.000;0.400;0.000 --> es werden die letzten 2 Werte gelöscht.

Die Textdatei besitzt einen Kopf der erhalten bleibt. Ab der Leerzeile befinden sich die Zeilen die mit dem Programm bearbeitet werden.

Kannst du mir vll noch kurz erklären was du mit Leerzeile berücksichtigen und der Letzten if Bedingung meinst?
Wäre super!

Danke für die ausführliche Beschreibung deines Programmes!

Vielen dank!
Bitte warten ..
Mitglied: 76109
21.06.2011 um 11:19 Uhr
Hallo m.matt85!

Ändere mal Codezeile 21:
01.
If UBound(Felder) = 5 Then 
Wenn auch mehr als 6 Felder vorkommen können/dürfen, dann:
01.
If UBound(Felder) >= 5 Then 
Gruß Dieter
Bitte warten ..
Mitglied: bastla
21.06.2011 um 11:31 Uhr
Hallo m.matt85!

Ich kann zwar anhand Deines Beispieles den Fehler nicht nachvollziehen, aber versuch es alternativ mit der folgenden Schleife (ab Zeile 15):
01.
For i = 0 To UBound(Zeilen) 
02.
    'Falls bereits geschrieben werden soll und die Zeile nicht mit dem Trennzeichen endet  
03.
    If Schreiben And Right(Zeilen(i), 1) <> Delim Then 
04.
        'Zeichenanzahl vor dem letzten Trennzeichen ermitteln 
05.
        L = InStrRev(Zeilen(i), Delim) - 1 
06.
        'Wenn es Text vor dem letzten Trennzeichen gibt, ... 
07.
        If L > 0 Then 
08.
            '... nur diesen schreiben, ... 
09.
             AusDatei.WriteLine Left(Zeilen(i), L) 
10.
        Else 
11.
            '... ansonsten die Zeile unverändert ausgeben 
12.
             AusDatei.WriteLine Zeilen(i) 
13.
        End If 
14.
    Else 
15.
        'Wenn Leerzeile gefunden, folgende Zeilen schreiben  
16.
        If Zeilen(i) = "" Then Schreiben = True 
17.
    End If 
18.
Next
Kannst du mir vll noch kurz erklären was du mit Leerzeile berücksichtigen und der Letzten if Bedingung meinst?
Ich hatte das so interpretiert, dass erst nach der ersten Leerzeile Zeilen untersucht und ausgegeben werden sollen - daher wird erst dann das Schreiben "freigegeben" ...

Sollen die Kopfzeile (bis zur ersten Leerzeile) unverändert übernommen werden, müsste die Schleife eher so aussehen:
01.
'Flag für "Sollen Zeilen ab jetzt bearbeitet werden?" initialisieren  
02.
Bearbeiten = False 
03.
For i = 0 To UBound(Zeilen) 
04.
    'Falls bearbeitet werden soll (keine Kopfzeile mehr) 
05.
    If Bearbeiten Then 
06.
        'Zeile nur übernehmen,wenn nicht Trennzeichen am Ende 
07.
        If Right(Zeilen(i), 1) <> Delim Then 
08.
            'Zeichenanzahl vor dem letzten Trennzeichen ermitteln 
09.
            L = InStrRev(Zeilen(i), Delim) - 1 
10.
        'Wenn es Text vor dem letzten Trennzeichen gibt, ... 
11.
            If L > 0 Then 
12.
            '... nur diesen schreiben, ... 
13.
                AusDatei.WriteLine Left(Zeilen(i), L) 
14.
            Else 
15.
            '... ansonsten die Zeile unverändert ausgeben 
16.
                AusDatei.WriteLine Zeilen(i) 
17.
            End If 
18.
        End If 
19.
    Else 
20.
        'Kopfzeile - daher unverändert ausgeben 
21.
        AusDatei.WriteLine Zeilen(i) 
22.
        'Wenn Leerzeile gefunden, folgende Zeilen bearbeiten  
23.
        If Zeilen(i) = "" Then Bearbeiten = True 
24.
    End If 
25.
Next
Grüße
bastla
Bitte warten ..
Mitglied: bastla
21.06.2011 um 12:11 Uhr
@Dieter
Der Test auf
UBound(Felder) > 0
soll nur verhindern, dass
Felder(UBound(Felder)) = ""
danabengeht - für eine Leerzeile ergibt "UBound(Felder)" nämlich -1...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
21.06.2011 um 12:44 Uhr
Hallo bastla!

Das ist mir schon klar, aber ich habe es so verstanden bzw. vermutet, dass es mehre unterschiedliche Datensätze gibt und m.matt85 eben nur diese speziellen Datensätze auslesen will. Kann natürlich auch sein, wie Du ja schon angedeutet hast, dass es mehrere Leerzeilen gibt oder wie auch immer (Ratespiel)

Gruß Dieter
Bitte warten ..
Mitglied: m.matt85
21.06.2011 um 13:19 Uhr
@76109 :es gibt entweder 5 Felder ( wenn nach dem ; kein Wert mehr steht) oder 6 Felder ( wenn nach dem ; ein Wert steht)

@ bastla :das mit der Kopfzeile und mit der veränderten Schleife funktioniert.

Vielen vielen Dank für eure Hilfe!

Grüße
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Batch & Shell
Merkwürdige Zeilenformatierung in txt Datei (3)

Frage von miczar zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...