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, 4603 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 ..
Ähnliche Inhalte
Neue Wissensbeiträge
Batch & Shell

Batch - ein paar Basics die man kennen sollte

Tipp von Pedant zum Thema Batch & Shell ...

Microsoft

Restrictor: Profi-Schutz für jedes Window

(6)

Tipp von AlFalcone zum Thema Microsoft ...

Batch & Shell

Batch zum Zurücksetzen eines lokalen Profils

Tipp von Mr.Error zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Benutzer lässt sich nur an einem Clientcomputer anmelden (11)

Frage von Ammann zum Thema Windows Server ...

Hosting & Housing
gelöst Webserver bei WIX, aber DNS Server wo anders (9)

Frage von laster zum Thema Hosting & Housing ...

Batch & Shell
gelöst Gruppenzugehörigkeit von AD Usern ermitteln - die Perfektion fehlt (9)

Frage von Stefan007 zum Thema Batch & Shell ...