Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung Batch & Shell

GELÖST

Leerer Token am Anfang wird nicht erkannt

Mitglied: ruebensau

ruebensau (Level 1) - Jetzt verbinden

31.07.2008, aktualisiert 05.08.2008, 4110 Aufrufe, 8 Kommentare

Hallo Leute,

leere Token werden ja normalerweise mit der FOR /R Schleife übersprungen.
Mit dem EnableDelayedExpansion sollte das doch aber möglich sein auch den Token am Anfang der Zeile mitzunehmen wenn er leer ist. Klappt aber nicht bei mir.

Hier ist meine Beispieldatei: (test.csv)

A10020;A10020-1-975639001-20040525-ARA-51147;25.05.2004;ARA;1;04NK13730;51147;975639001
;A10020-1-975639001-20041215-ARA-51147;15.12.2004;ARA;1;04NK29630;51147;975639001
;A10020-1-975639001-20040525-A-51147;25.05.2004;A;1;04NK13730;51147;975639001
;A10020-1-975639001-20040525-Z-51147;25.05.2004;Z;1;04NK13730;51147;975639001

Wenn ich nun diesen Batch ausführe:

@echo off & Setlocal EnableDelayedExpansion
for /f "delims=" %%i in (test.csv) do (
set "in=%%i"
for /f "delims=; tokens=1-3" %%a in ("!in:;;=;NULL;!") do (
echo 1[%%a] 2[%%b] 3[%%c] >> output.txt
))

bekomme ich folgenden output: output.txt

1[A10020] 2[A10020-1-975639001-20040525-ARA-51147] 3[25.05.2004]

die restlichen 3 Zeilen werden nicht ausgegeben.

Warum?

Danke!
Mitglied: bastla
31.07.2008 um 15:06 Uhr
Hallo rübensau!

Ändere die Zeile 2 auf
01.
for /f "eol=$ delims=" %%i in (test.csv) do (
wobei für "$" gilt, dass damit ein (fast) beliebiges nicht in den Daten vorkommendes Zeichen gemeint ist.

Warum?
Meine Interpretation: ";" wird als Defaultwert für einen "Zeilenendekommentar" (siehe "for /?") verwendet - mehr dazu weiß sicher Biber ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
31.07.2008 um 16:26 Uhr
Moin Rübensau und bastla,

bastlas Interpretation kann ich nur zustimmen...
Das "eol=§" (o.ä.) in der Zeile 2 ist auf jeden Fall ein notwendiger Schritt.

Dann lasst uns das gleich wasserdicht machen, denn das Drama mit der Redmonder PraktikantInnenlogik geht ja noch weiter.

Zeilen beginnend mit einem ";" werden komplett ignoriert -> Abhilfe "eol=§". Haken dran.

Bleiben zwei Probleme Details zu berücksichtigen:
  • das zweite Token n einer Zeile, die ";bla;Blubb" heißt, wäre nicht "bla".
01.
>for /f "delims=; tokens=1-3" %i in (";bla;Blubb") do @echo 1[%i] 2[%j] 3[%k] 
02.
1[bla] 2[Blubb] 3[]
Also müssen wir dafür sorgen, dass auch, sollte das erste Token NULL sein, auch eine Ausgabe als NULL erfolgt.
Dazu bitte die Zeile
set "in=%%i"
ändern in:
set "in=;%%i"

Dritte Schwierigkeit wird (jetzt kommen die Redmonder Praktikanten ins Spiel), dass die Ersetzen-Logik äußerst ausgefeilt ist bei den Brüdern.
Sollte sich die Variable %in% durch ein Ersetzen von Zeichen verlängern, dann werden nicht alle Vorkommnisse des Zu-Ersetzen-Strings gefunden.

Auf Deutsch:
01.
>set "intest=;;;token4;token5;;;" 
02.
 
03.
>echo %intest:;;=;NULL;% 
04.
;NULL;;token4;token5;NULL;;
Klasse, oder?
Ein Königreich für einen Baseballschläger...

Anyhow, wenn wir das Ersetzen mehrfach machen, ist auch das Problem erledigt.

Also im Ergebnis:
01.
::---CsvMitNULLWertenRichtigLesen.cmd--------- 
02.
::@Echo off  & setlocal enabledelayedexpansion 
03.
for /f "eol= delims=" %%i in (test.csv) do (  
04.
set "in=;%%i"  
05.
set "in=!in:;;=;NULL;!"  
06.
for /f "delims=; tokens=1-3" %%a in ("!in:;;=;NULL;!") do (  
07.
echo 1[%%a] 2[%%b] 3[%%c] 
08.
))
Die Anzahl der nötigen Zeilen [set "in=!in:;;=;NULL;!" ] lässt sich sicherlich mathematisch berechnen.
Aber nicht von mir...

Bei mehr als 3 NULLABLE Tokens in der Quelldatei würde ich darauf achten.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
31.07.2008 um 17:12 Uhr
@Biber

Sollte dann nicht vielleicht auch noch am Ende ein ";" dazu, also
01.
set "in=;%%i;"
damit die Variable für das letzte Token ebenfalls im Fall des Falles "NULL" und nicht einfach nichts enthält?

Grüße
bastla
Bitte warten ..
Mitglied: Biber
31.07.2008 um 20:03 Uhr
@bastla
Sollte dann nicht vielleicht auch noch am Ende ein ";" dazu?
Hast Du den Ausdruck "rhetorische Frage" schon mal gehört?

Wir dürfen nur nicht zu offensichtlich unsere Bätche robuster und fehlertoleranter zusammenschroten als gewisse andere Softwareklitschen ihre Betriebssysteme.

Sonst geht es uns wie Mark Russinovich...
Und, um das Erlernte bezüglich rhetorischer Fragen gleich anzuwenden:
Möchtest Du, dass Deine Schnipsel erst nach einem erfolgreich bestandenen Genuine Check das tun dürfen, was sie schon immer taten?

Also formulieren wir es so:
Mit einem weiteren ";" am Ende ist es sicherlich für einen Batchschnipsel schon relativ robust geschrieben.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
31.07.2008 um 21:37 Uhr
@Biber
Möchtest Du, dass Deine Schnipsel erst nach einem erfolgreich bestandenen Genuine Check das tun dürfen, was sie schon immer taten?
OK, Du hast mich überzeugt - ich ziehe meine Frage zurück ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
31.07.2008 um 23:43 Uhr
Noch ein reumütiger Nachsatz....

Ich wurde eben per PN darauf hingewiesen, dass meine Formulierung
Dritte Schwierigkeit wird (jetzt kommen die Redmonder Praktikanten ins Spiel), dass die Ersetzen-Logik äußerst ausgefeilt ist bei den Brüdern.

...doch eventuell als abwertend oder diskriminierend aufgefasst werden könnte.
Sehe ich ein und entschuldige mich dafür.

Natürlich hätte es heißen müssen:
Dritte Schwierigkeit wird (jetzt kommen die Redmonder PraktikantInnen ins Spiel), dass die Ersetzen-Logik äußerst ausgefeilt ist bei den Brüdern und Schwestern.

Grüße
Biber
Bitte warten ..
Mitglied: 67369
31.07.2008 um 23:53 Uhr
*ROFL*
Bitte warten ..
Mitglied: ruebensau
05.08.2008 um 10:04 Uhr
danke erstaml,
bin heute erst wieder im büro und werde es heute noch testen. Dann weiß ich, ob ich den thread als abgehackt markieren kann.

MfG
Rübe
Bitte warten ..
Ähnliche Inhalte
Weiterbildung
Wo soll ich anfangen?
gelöst Frage von OVONELWeiterbildung7 Kommentare

Hallo alle zusammen! Im September schließe ich meine Ausbildung zum Fachinformatiker - Systemintegration meine schulischen Noten sind soweit in ...

Batch & Shell
Warum Funktioniert der tokens befehl nicht
gelöst Frage von DomiZone1Batch & Shell5 Kommentare

Hallo liebe Administartor Community Ich Beis gleich in mein nicht vorhandenes lenkrad :D der befehl: for /f "delims=: tokens1,2" ...

Sicherheit
Sophos Lan Crypt mit Token
Frage von hscheipSicherheit1 Kommentar

Hallo zusammen, ich hab erfolgreich Lancrypt installiert und würde jetzt gerne einen Token für die Authentifizierung des Nutzers einsetzen. ...

Sicherheit
OTP Hardware Token ohne zentrale Infrastruktur
gelöst Frage von eglipeterSicherheit3 Kommentare

Hallo zusammen, ich möchte gerne, dass sich unsere Windows- und Linux-Nutzer an ihren Geräten jeweils mit Passwort + OTP ...

Neue Wissensbeiträge
Router & Routing

PfSense als Addon auf QNAP

Information von magicteddy vor 12 StundenRouter & Routing2 Kommentare

Moin, für Spielereien eine ganz nette Idee aber ich fürchte das soetwas auch als echte Firewall genutzt wird: In ...

Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 18 StundenDatenschutz

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 23 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement22 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk13 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

Windows Server
Terminal Server 2016 erkennt Berechtigungen nicht
gelöst Frage von Thomas2Windows Server10 Kommentare

Hallo Administratoren, folgendes Problem stellt sich dar: Es gibt zwei Windows Server 2016, die als Terminal Server fungieren. Jetzt ...

Sonstige Systeme
7-zip: Programm frägt nach Passwort erst bei einzelnen Dateien
Frage von freeskierchrisSonstige Systeme7 Kommentare

Guten Morgen, ich habe ein Problem beim Arbeiten mit 7-zip: Wenn ich die einzelnen Dateien zu einem Archiv verpacke ...