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

Zeilen in einer Textdatei verschieben

Frage Entwicklung Batch & Shell

Mitglied: vvss

vvss (Level 1) - Jetzt verbinden

24.04.2008, aktualisiert 25.04.2008, 3158 Aufrufe, 5 Kommentare

Hallo zusammen,

ich habe eine Texdatei, bei der die Zeilen wie folgt beginnen:

KSTA_
KZEI_
KPPA_
KPPA_
KPPA_
KPPA_
KUTX_
KUTX_
KSTA_
KZEI_
KPPA_
KPPA_
KTVA_
KSTA_
KZEI_
KPPA_
KPPA_
KSTA_
......

Dabei ist KSTA immer der Anfang eines neuen Datensatzes und alles was dazwischen ist gehört zusammen.
Die Zeilen mit KTVA können pro zusammenhängendem Datensatz vorhanden sein, müssen aber nicht.

Nun mein Problem:
Ich möchte mit einer Batchdatei ,wenn die Zeile KTVA_ vorkommt diese unter die Zeile KSTA_ des dazugehörigen Datensatzes verschieben.
Habe schon etwas mit findstr rumprobiert, es will mir aber nicht so recht gelingen.

Kann mir jemand helfen?

Danke
Mitglied: bastla
24.04.2008 um 18:13 Uhr
Hallo -vvss- und willkommen im Forum!

Einige Fragen:
  • Kann je Datensatz mehr als eine Zeile mit KTVA beginnen?
  • Die mit KTVA beginnende(n) Zeile(n) soll(en) in der neuen Datei unmittelbar nach der KSTA-Zeile eingeordnet werden - richtig?
  • Soll eine Sicherungskopie erstellt, bzw die neue Datei unter einem anderen Namen als die Ausgangsdatei gespeichert werden?
  • Hättest Du Einwände gegen eine Lösung in VBScript?

Grüße
bastla
Bitte warten ..
Mitglied: vvss
24.04.2008 um 18:41 Uhr
Hallo bastla,

bin nun schon eine ganze Weile hier im Forum am lesen und probieren.
BIN BEGEISTERT, was man nicht alles mit so einer Batchdatei machen kann.

Nun aber zu meinem Problem.
In einem Datensatz, also die Zeilen zwischen den KSTA's, gibt es falls vorhanden nur eine Zeile die mit KTVA beginnt.
Es gibt aber evtl. mehrere Zeilen KTVA in der gesamten Datei, aber immer nur eine zwischen den KSTA- Zeilen.
Ja, die Zeile KTVA soll immer nach der entsprechenden KSTA- Zeile geschrieben werden.
Eine Sicherungskopie der Originaldatei ist nicht notwendig.
Gegen VBScript spricht natürlich nichts.


Schon mal Danke im Voraus.
Bitte warten ..
Mitglied: bastla
24.04.2008 um 18:55 Uhr
Hallo -vvss-!

BIN BEGEISTERT, was man nicht alles mit so einer Batchdatei machen kann.
Geht mir auch so, aber manchmal eignet sich VBS etwas besser ...

01.
Const Datei = "D:\Daten.txt" 
02.
Const BakExt = ".bak" 
03.
Const String1 = "KSTA_" 
04.
Const String2 = "KTVA_" 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
If Not fso.FileExists(Datei) Then 
08.
	WScript.Echo "Die Datei " & Datei & " wurde nicht gefunden!" 
09.
	WScript.Quit 
10.
End If 
11.
Zeilen = Split(fso.OpenTextFile(Datei).ReadAll, vbCrLF) 
12.
 
13.
Bak = Datei & BakExt 
14.
If fso.FileExists(Bak) Then fso.DeleteFile(Bak) 
15.
fso.MoveFile Datei, Bak 
16.
 
17.
Set DateiNeu = fso.CreateTextFile(Datei, True) 
18.
 
19.
LS1 = Len(String1) 
20.
LS2 = Len(String2) 
21.
RecStartIndex = -1 
22.
S2Index = -1 
23.
U = UBound(Zeilen) 
24.
i = 0 
25.
 
26.
Do While i <= U 
27.
	If StrComp(String1, Left(Zeilen(i), LS1), vbTextCompare) = 0 Then 
28.
		If RecStartIndex >= 0 Then RecWrite 'vorigen Satz schreiben 
29.
		RecStartIndex = i 
30.
	ElseIf 	StrComp(String2, Left(Zeilen(i), LS2), vbTextCompare) = 0 Then 
31.
		S2Index = i 
32.
	End If 
33.
	i = i + 1 
34.
Loop 
35.
RecWrite 'letzten Satz schreiben 
36.
DateiNeu.Close 
37.
If fso.FileExists(Bak) Then fso.DeleteFile(Bak) 'Backup (=Original-Datei) löschen 
38.
 
39.
Sub RecWrite 
40.
DateiNeu.WriteLine Zeilen(RecStartIndex) 
41.
If S2Index >= 0 Then DateiNeu.WriteLine Zeilen(S2Index) 
42.
For j = RecStartIndex + 1 To i - 1 
43.
	If j <> S2Index Then DateiNeu.WriteLine Zeilen(j) 
44.
Next 
45.
S2Index = -1 
46.
End Sub
Bitte den Dateinamen (inkl. Pfad) in der ersten Zeile anpassen.

Zur Sicherheit wird trotzdem ein Backup erstellt, aber gelöscht, wenn das Script durchgelaufen ist. Solltest Du es dennoch behalten wollen, einfach vor die entsprechende Zeile ein Apostroph setzen.

Grüße
bastla

[Edit] Zeile "DateiNeu.Close" ergänzt. [/Edit]
Bitte warten ..
Mitglied: vvss
25.04.2008 um 18:46 Uhr
Hallo bastla,

vielen Dank für deine schnelle Antwort, dein Script funkioniert wunderbar.
Habe aber vergessen zu erwähnen das alle Dateien in einem Ordner so bearbeitet werden sollen.
Mich hat aber der Ehrgeiz gepackt und werde es mal versuchen selber zu lösen.
Ist aber gar nicht so einfach, wenn man das erste mal so ein Script vor sich hat.


Habe das mal so probiert:

Const Verzeichnis = "D:\Daten_FTP"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Ordner = fso.GetFolder(Verzeichnis)
For Each Datei In Ordner.Files
Datei = Datei.Name
WScript.Echo "Die Datei " & Datei & " wurde gefunden"
If Not fso.FileExists(Verzeichnis & "\" &Datei) Then
WScript.Echo "Die Datei " & Datei & " wurde nicht gefunden!"
WScript.Quit
End If
If fso.FileExists(Verzeichnis & "\" &Datei) Then
WScript.Echo "Die Datei " & Datei & " wurde gefunden!"
WScript.Quit
End If


Next

Kopiere ich abe den Rest deines Scriptes vor das necht, bringt er mir Fehler in der Zeile, wo Sub RecWrite steht. Macht Spaß, bin schon Stunden am probieren, komme da erstmal nicht weiter.

Brauche mal nen kleinen Tip dazu.

Danke
Bitte warten ..
Mitglied: bastla
25.04.2008 um 18:58 Uhr
Hallo -vvss--!

Vorweg eine Anmerkung zu Deinem Script: Die Prüfung auf Vorhandensein der Datei kann entfallen - wenn sie nicht vorhanden wäre, hättest Du sie nicht per Variable "Datei" zur Verfügung (die ".Files"-Aufzählung liefert ja alle Dateien des Verzeichnisses "Ordner") ...

Das Einbinden meines Entwurfes von oben scheitert daran, dass dieser aus zwei Teilen besteht, von denen nur der erste in Deine Schleife darf - Teil 2 ist das Unterprogramm ("Sub") "RecWrite", welches ich ausgelagert habe, da ich diese Funktionalität zweimal benötige (in der Schleife für alle Datensätze mit Ausnahme des letzten, und nach der Schleife nochmals, um auch diesen letzten Satz schreiben zu können).

Grüße
bastla

P.S.: Gepostete Scripts sehen besser aus, wenn sie zwischen < code>-Tags (natürlich ohne das Leerzeichen) stehen (siehe hier)...
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...