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

Per Batch zeilenweise Zeichen Zählen

Frage Entwicklung Batch & Shell

Mitglied: marlasdad

marlasdad (Level 1) - Jetzt verbinden

08.12.2008, aktualisiert 09.12.2008, 9700 Aufrufe, 8 Kommentare

Hallo zusammen,

ich habe mich schon doof gegoogled und brauche mal Eure Hilfe.
Also, ich möchte eine Batch-Datei schreiben, welche in einer ASC-Datei die Anzahl eines bestimmten Zeichens ';' pro Zeile zählt und mir die Zeile(n) ausgibt, wo das Zeichen mehr als x mal vorkommt.
Habe leider nichts für mich verständliches zum Thema "delims" und for... und zu dem Gesamtproblem gefunden.

Mit -> findstr /n /b /R ";" Test.txt kann ich immerhin schonmal die Semikolons rauslesen. Aber wie zähle ich die im Batch Zeilenweise und gebe Sie dann Anzahl-abhängig aus?
Kann mir jemand helfen und vielleicht auch mal die ominöse Syntax von delims erklären?

Tausend Dank schonmal!

Gruss
Ralf
Mitglied: bastla
08.12.2008 um 17:54 Uhr
Hallo marlasdad und willkommen im Forum!

Vielleicht holst Du etwas weiter aus und beschreibst eine solche Zeile näher (bzw postest ein Beispiel) - aufgrund Deines "findstr"-Ansatzes müsste ja das erste ";" bereits am Anfang stehen ...

Was soll denn in weiterer Folge mit den gefundenen Daten geschehen?

Und noch eine Frage: Da sich Batch nur bedingt zum Handling von einzelnen Zeichen eignet: Gibt es einen Einwand Deinerseits gegen die Verwendung von VBScript (vorzugsweise in einen Batch eingebettet)?

Grüße
bastla
Bitte warten ..
Mitglied: miniversum
08.12.2008 um 20:03 Uhr
Mal so ins Blaue mit den Infos bis jetzt könnte sowas gehen:
01.
@echo off 
02.
FOR /F "tokens=1* delims=:" %%i in ('findstr /n /R ".*" "Datei.txt"') do call:search "%%j" %%i 
03.
goto:eof 
04.
 
05.
:search 
06.
 
07.
if "%~1" equ "" ( 
08.
echo 0 
09.
goto:eof 
10.
11.
 
12.
set "line=%~1" 
13.
set /a i=0 
14.
set /a anzahl=0 
15.
 
16.
:loop 
17.
set "z=" 
18.
call set z=%%line:~%i%,1%% 
19.
 
20.
if "%z%" equ "" ( 
21.
echo %anzahl% 
22.
goto:eof 
23.
24.
 
25.
if "%z%" equ ";" set /a anzahl=%anzahl%+1 
26.
 
27.
set /a i=%i%+1 
28.
goto:loop
Sonderzeichen machen da aber Probleme
Bitte warten ..
Mitglied: bastla
08.12.2008 um 20:41 Uhr
@miniversum

Ins Blaue kann ich auch:
01.
@echo off & setlocal 
02.
set "Datei=D:\Datei.txt" 
03.
set "Suche=;" 
04.
set /a Anz=3 
05.
 
06.
set G=%temp%\GNO.vbs 
07.
>%G% echo Set rE=New RegExp:rE.Pattern="%Suche%":rE.Global=True:WScript.Echo rE.Execute(WScript.Arguments(0)).Count 
08.
 
09.
for /f "tokens=1* delims=:" %%i in ('findstr /n "%Suche%" "%Datei%"') do  ( 
10.
    for /f %%a in ('cscript //nologo %G% "%%j"') do ( 
11.
        if %%a gtr %Anz% echo %%j 
12.
13.
)
Ausgegeben werden alle Zeilen, in denen mehr als 3 ";" enthalten sind.

Grüße
bastla
Bitte warten ..
Mitglied: marlasdad
09.12.2008 um 08:20 Uhr
Hallo und danke für die schnellen Antworten!

Also, ich muss Massendaten in eine Oracle-DB einlesen. Die einzelnen Werte sind durch ";" getrennt und manchmal passiert es, dass in einem Wert nochmal ein Semikolon ist. Pro Zeile sollten 20 Semikolons vorhanden sein (21Werte). Nun wäre es schön,
wenn ich so eine falschen Datensatz vor demeinlesen erkennen könnte. Das einlesen mach ich per Batch und sqlloader. Hier könnte ich ja die Prüfung einbauen.
Allerding wäre natürlich VBS auch ok. DDas könnte ich ja dann aufrufen. Wi gesagt, ich habe nichts wirklich einleuchtendes zur Erklärung von delims gefunden und würde mich über Infos hierzu freuen.

Danke und Gruss
Ralf
Bitte warten ..
Mitglied: bastla
09.12.2008 um 08:57 Uhr
Hallo marlasdad!

Allerding wäre natürlich VBS auch ok. DDas könnte ich ja dann aufrufen.
Ein (zusätzliches) VBScript ist gar nicht nötig - der Batch erstellt für die benötigte Funktionalität das Script selbst (siehe mein Ansatz oben).
Kurz zu "delims": Damit werden in einer "for /f"-Schleife das/die Trennzeichen festgelegt. Anhand dieser Trennzeichen erfolgt die Aufteilung der jeweils zu bearbeitenden Zeile - vergleichbar mit der "Split"-Funktion in VB. Das Ergebnis steht dann in alphabetisch benannten Variablen (frei wählbar, meist wird mit %%i begonnen) zur Verfügung. Wird "delims" nicht angegegen, gelten Leerzeichen und TAB als Trennzeichen. Es können auch mehrere Trennzeichen festgelegt werden (etwa "delims=.:", um einen Timestamp aufzusplitten). Ein explizites "delims=" (also ohne Angabe eines Trennzeichens) sorgt dafür, dass die Zeile ungetrennt in der Variablen zur Verfügung steht.

Mit der Angabe von "tokens" steuerst Du, welche Bestandteile der Zeile verwendet werden sollen - Beispiel:
for /f "tokens=1-3,6 delims=," %%i in (D:\EineTextdatei.txt) do echo %%i-%%j-%%k-%%l
würde aus einer CSV-Datei (tatsächlich mit Komma getrennt ) die Felder 1 bis 3 und 6, durch "-" verbunden, ausgeben. Eine oft nützliche weitere Schreibweise für "tokens" ist
for /f "tokens=1,3,5* delims=," %%i in (D:\EineTextdatei.txt) do echo %%i-%%j-%%k-%%l
Hier würden die Felder 1, 3, 5 sowie alle Felder ab 6 (letztere inklusive der Trennzeichen dazwischen) ausgegeben.

Um Deine Zeilen (Datensätze) aufzuteilen, müsstest Du also etwa so vorgehen (Beginn mit %%a, damit alle 21 Felder "Platz" haben):
for /f "tokens=1-21 delims=;" %%a in (D:\DeineDatei.txt) do echo %%a_%%b_..._%%u
Noch ein Hinweis: Die Schreibweise aller Beispiele mit 2 Prozentzeichen ist für die Verwendung in einem Batch gedacht - wenn Du an der Kommandozeile testen willst, jeweils nur ein Prozentzeichen verwenden.

Grüße
bastla
Bitte warten ..
Mitglied: marlasdad
09.12.2008 um 09:34 Uhr
Super, sehr schön erklärt, Danke!

Ich habe mal beide Scripte laufen lassen.
Das erste macht wohl ne Endlosschleife und das zweite läuft soweit
Nur bei 1Million DS läuft es schon twas länger., jetzt schon 1 Stunde. Kann das?
Und was macht das gno.vbs?
Dazu habe ich nix gefunden.


gruss
marlasdad
Bitte warten ..
Mitglied: bastla
09.12.2008 um 10:32 Uhr
Hallo marlasdad!

Und was macht das gno.vbs?
Das in Zeile 7 durch den Batch erzeugte Script sieht (etwas aufgeteilt) so aus:
01.
Set rE=New RegExp 
02.
rE.Pattern="%Suche%" 
03.
rE.Global=True 
04.
WScript.Echo rE.Execute(WScript.Arguments(0)).Count
Durch den Batch wird der Suchbegriff %Suche% (in diesem Fall ";") unmittelbar in den Scriptcode geschrieben. Das Script wird für jede Zeile der Textdatei (diese wird als Parameter übergeben) aufgerufen (was natürlich für eine große Zahl an Datensätezn entsprechend dauert) und liefert die Anzahl der enthaltenen Trennzeichen als Ausgabe an den Batch zurück.
Eine "VBS-only"-Variante sollte natürlich schneller sein:
01.
Set rE = New RegExp 
02.
rE.Pattern = ";" 'Suchbegriff 
03.
rE.Global = True 
04.
Anzahl = 20 'Anzahl der Suchbegriffe, die nicht überschritten werden soll 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
DateiEin = WScript.Arguments(0) 
08.
DateiAus = fso.GetParentFolderName(DateiEin) & "\" & _ 
09.
    fso.GetBaseName(DateiEin) & "-Fehler" & "." & _ 
10.
    fso.GetExtensionName(DateiEin) 
11.
 
12.
Set Ein = fso.OpenTextFile(DateiEin) 
13.
Set Aus = fso.CreateTextFile(DateiAus, True) 
14.
i = 1 
15.
Do While Not Ein.AtEndOfStream 
16.
    Zeile = Ein.ReadLine 
17.
    If rE.Execute(Zeile).Count > Anzahl Then 
18.
        Aus.WriteLine Right(Space(8) & i, 8) & ": " & Zeile 
19.
    End If 
20.
    i = i + 1 
21.
Loop 
22.
Aus.Close 
23.
Ein.Close
Zu starten wäre das Script mit Übergabe der zu untersuchenden Datei, also etwa:
cscript //nologo CheckData.vbs "D:\Datei.txt"
In dieser Fassung des Scripts erfolgt keine Prüfung auf Vorhandensein der Eingabedatei (kann aber schon im aufrufenden Batch erledigt werden). Die fehlerhaften Dateien werden (inkl max 8-stelliger Zeilennummern, rechtsbündig formatiert) in eine Datei im gleichen Pfad wie die übergebene Datei mit dem Namenszusatz "-Fehler" geschrieben.

Grüße
bastla
Bitte warten ..
Mitglied: marlasdad
09.12.2008 um 11:10 Uhr
Das ist ja ein riesen Unterschied von der Laufzeit her!
Das VBS läuft super!
Danke!!
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Batch ausgabe zeilenweise stat spaltenweise ausgeben (4)

Frage von sugram zum Thema Batch & Shell ...

Batch & Shell
Datein zählen via Batch und Berechnen (1)

Frage von Anrion zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch for f Befehl erkennt doppelte Zeichen als eines (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 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 ...