2017-05-17 4 views
1

Ich habe zwei. Txt-Dateien. Einer enthält Zahlen und der andere enthält Dateipfade. Ich möchte diese beiden Dateien zu einer .csv kombinieren. Die Kombination basiert darauf, ob sich die Zahl (aus nrs.txt) in der Zeichenfolge des Dateipfads (nodups.txt) befindet.Verschachtelt/F-Schleife und If-Anweisungen in der Batch-Datei

Jetzt habe ich den folgenden Code dafür:

@setlocal enableextensions enabledelayedexpansion 

for /F %a IN (Output\nrs.txt) DO (
    SET "nrs=%a" 

    for /F %b IN (Output\nodups.txt) DO (
     SET "pathstring=%b" 
     SET csvdelim=, 
     IF NOT x!pathstring:%nrs%=""!==x%pathstring% %nrs%,%pathstring%>>new2017.txt 
    ) 
) 

@endlocal 

Allerdings halte ich mit dem Code die folgenden Probleme mit:

  1. Die pathstring scheint nie eingestellt werden. (Wenn ich den Code ohne die if-Anweisung ausführe, wird die Variable nrs gesetzt, aber the pathstring is set to %b). Ich habe hier schon viele mögliche Lösungen gesehen, aber keine scheint für mich zu funktionieren (Variablen wie !var! setzen und usebackq verwenden).
  2. Die IF-Anweisung in der zweiten for-Schleife erhält folgende Fehlermeldung =""!==x%pathstring% was unexpected at this time. Die ="" sollte die nr entfernen. vom Weg (wenn es da ist). Wenn ich "" durch etwas anderes ersetze, funktioniert es immer noch nicht.

Der Inhalt der Datei sind:

Datei nrs.txt:

12345 
12245 
16532 

nodubs.txt:

C:\tmp\PDF_16532_20170405.pdf 
C:\tmp\PDF_1234AB_20170405.pdf 
C:\tmp\PDF_12345_20170506.pdf 

gewünschte Ausgabe:

12345, C:\tmp\PDF_12345_20170506.pdf 
16532, C:\tmp\PDF_16532_20170405.pdf 

Ich hoffe wirklich, dass mir jemand dabei helfen kann!

Antwort

1

Diese Lösung einen anderen Ansatz verwenden, basierend auf arrays:

@echo off 
setlocal EnableDelayedExpansion 

rem Load array from nodubs.txt file 
pushd "Output" 
for /F "tokens=1,2* delims=_" %%a in (nodubs.txt) do set "nodubs[%%b]=%%a_%%b_%%c" 

rem Process nrs.txt file and show output 
(for /F %%a in (nrs.txt) do (
    if defined nodubs[%%a] echo %%a, !nodubs[%%a]! 
)) > new2017.txt 
+0

Ich bevorzuge diese Lösung, da es für mich klarer ist, wie es funktioniert (und wenn sich überhaupt etwas ändert, weiß ich, wo ich Anpassungen vornehmen muss). Wenn ich es jedoch so ausführe, bekomme ich keine Ausgabe. Wenn ich das '@echo off' entferne, bekomme ich folgendes: ' C: \ Pfad \ Ausgabe> (falls definiert nodubs [12345] echo 12345,! Nodubs [12345]!) C: \ Pfad \ Ausgabe> (falls definiert nodubs [12245] echo 12245,! nodubs [12245]!) C: \ Pfad \ Ausgabe> (falls definiert nodubs [16532] echo 16532,! nodubs [16532]!) ' – Coen

+0

Sie können die Klammern entfernen das die Umleitung und die Umleitung umgibt, das heißt, ändern Sie '(für ...))> new2017.txt' durch' für ...) 'und fügen Sie dann die' >> new2017.txt' Umleitung am Ende von 'echo ein %% a, ... 'Zeile. – Aacini

+0

Vielen Dank! – Coen

0
  • In einer Batch-Datei für Variablen müssen zwei Prozentzeichen.
  • Es ist nicht notwendig, %%A in eine Variable zu setzen, verwenden Sie sie direkt.

@setlocal enableextensions enabledelayedexpansion 
for /F %%a IN (Output\nrs.txt) DO (
    findstr /i "_%%a_" Output\nodups.txt >NUL 2>&1 || >>new2017.txt Echo %%a 
) 
@endlocal 
  • Statt einer Sekunde, würde ich verwenden findstr für den Eintritt von nrs.txt in Unterstrichen eingeschlossen zu suchen.
  • wenn keine finden bedingte Ausführung bei Ausfall || zu der neuen Datei zu schreiben.
+0

Es tut mir leid, ich glaube, ich war unklar. Ich muss den Pfad und die Nummer in der neuen Datei anhängen. Ist das mit deinem Weg machbar?Auch aus irgendeinem Grund gibt mir %% ein '%% a war unerwartet zu diesem Zeitpunkt' Fehler. Deshalb habe ich% a verwendet (was anscheinend funktioniert hat) – Coen

+0

Bitte bearbeiten Sie Ihre Frage, um ein Beispiel Ihrer gewünschten Ausgabe basierend auf Beispiel nrs.txt und nodubstxt – LotPings

+0

'% a' und'% b' wie in Ihren Beispielen zu verwenden funktioniert nicht in einer Batch-Datei und da Ihre Post eine Batch-Datei ist, ist @LotPings korrekt. – Compo

0

Nach geänderten Vorbemerkungen eine andere Antwort.

@Echo on 
Pushd Output 
for /F "tokens=1-3 delims=_" %%A IN (
    ' findstr /G:nrs.txt nodubs.txt' 
) DO >>"..\new2017.txt" Echo %%B, %%A_%%B_%%C 
Popd 

Beispielausgabe:

> type ..\new2017.txt 
16532, C:\tmp\PDF_16532_20170405.pdf 
12345, C:\tmp\PDF_12345_20170506.pdf 
Verwandte Themen