2017-02-19 3 views
-1

Ich habe eine Textdatei. Ich muss ungerade und gerade Linien tauschen.Wie vertauschen Sie ungerade und gerade Zeilen in einer Textdatei?

Ich machte ein Batch-Skript, das gerade Zeilen in testfile2.txt und ungeraden Zeilen in testfile3.txt schreibt.

@echo off 
setlocal EnableDelayedExpansion 
set "filepath1=C:\\Users\\andyb\\Desktop\\testfile.txt" 
set "filepath2=C:\\Users\\andyb\\Desktop\\testfile2.txt" 
set "filepath3=C:\\Users\\andyb\\Desktop\\testfile3.txt" 
set counter=0 
set B=0 
for /F %%A in (%filepath1%) do (
set /a B=!counter!%%2 
if !B! equ 0 (echo %%A>>%filepath2%) else (echo %%A>>%filepath3%) 
set /A counter=counter+1 
) 

Und ich will 1 Zeile aus der Datei nehmen, die ungeraden Zeilen enthält, dann 1 Zeile aus der Datei mit geraden Zeilen und schreiben Sie es auf meine erste Datei. Aber ich verstehe nicht, wie man es in FOR Schleife macht, weil es eine Zeile aus nur einer Datei liest und ich kann nicht mit einer anderen Datei in dieser Schleife arbeiten.

Beispiel der Eingabedatei:

1a 
2b 
3c 
4d 

Beispiel der Ausgabedatei:

2b 
1a 
4d 
3c 
+0

Warum haben Ihre Dateipfade doppelte Backslashes? Jeder einzelne Dateipfad auf jedem PC, den ich jemals benutzt habe, hat einen einzelnen Backslash. – Compo

+0

es ist meine Gewohnheit, es funktioniert – andybelous2

+3

Es ist [falsch] (https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247 (v = vs.85) .aspx # Pfade), ändern deine schlechte Angewohnheit! – Compo

Antwort

0

Es gibt mehrere Lösungen für diese Aufgabe.

Die erste verwendet eine verzögerte Erweiterung bei der Ausführung aller Zeilen der Batch-Datei, die ungerade und gerade Zeilen austauschen. Das heißt, es funktioniert nicht richtig für Zeilen mit einem Ausrufezeichen in der Zeile, weil ! aus Zeile entfernt wird.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "SourceFile=%USERPROFILE%\Desktop\TestFile.txt" 
if not exist "%SourceFile%" goto EndBatch 
set "TargetFile=%USERPROFILE%\Desktop\TestFile2.txt" 
del "%TargetFile%" 2>nul 

set "LineOdd=" 
for /F "usebackq delims=" %%I in ("%SourceFile%") do (
    if not defined LineOdd (
     set "LineOdd=%%I" 
    ) else (
     echo %%I>>"%TargetFile%" 
     echo !LineOdd!>>"%TargetFile%" 
     set "LineOdd=" 
    ) 
) 

if defined LineOdd echo !LineOdd!>>"%TargetFile%" 
move /Y "%TargetFile%" "%SourceFile%" 

:EndBatch 
endlocal 

Blank und Leerzeilen werden von FÜR übersprungen und damit in die Zieldatei fehlt. Und Zeilen, die mit einem Strichpunkt ; beginnen, werden beim Lesen jeder Zeile von FOR ignoriert und deshalb auch in der Ausgabedatei fehlen. Diese Einschränkungen sollten hier jedoch nach Eingabebeispiel keine Rolle spielen.

die Grenzen der ersten Lösung konnte mit diesem Batch Code vermieden werden, was natürlich viel langsamer ist:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
set "SourceFile=%USERPROFILE%\Desktop\TestFile.txt" 
if not exist "%SourceFile%" goto EndBatch 
set "TargetFile=%USERPROFILE%\Desktop\TestFile2.txt" 
del "%TargetFile%" 2>nul 

set "LineOdd=" 
for /F "tokens=1* delims=:" %%H in ('%SystemRoot%\System32\findstr.exe /N /R "^" "%SourceFile%"') do (
    if not defined LineOdd (
     set "LineOdd=_%%I" 
    ) else (
     if "%%I" == "" (
      echo/>>"%TargetFile%" 
     ) else (
      echo %%I>>"%TargetFile%" 
     ) 
     setlocal EnableDelayedExpansion 
     if "!LineOdd!" == "_" (
      echo/>>"%TargetFile%" 
     ) else (
      echo !LineOdd:~1!>>"%TargetFile%" 
     ) 
     endlocal 
     set "LineOdd=" 
    ) 
) 

if defined LineOdd (
    setlocal EnableDelayedExpansion 
    if "!LineOdd!" == "_" (
     echo/>>"%TargetFile%" 
    ) else (
     echo !LineOdd:~1!>>"%TargetFile%" 
    ) 
    endlocal 
) 
move /Y "%TargetFile%" "%SourceFile%" 

:EndBatch 
endlocal 

Es wäre auch möglich, Hybrid-Batch-Datei JREPL.BAT von Dave Benham geschrieben zu verwenden:

call jrepl.bat "^(.*)\r\n(.*)\r\n" "$2\r\n$1\r\n" /M /X /F "%USERPROFILE%\Desktop\TestFile.txt" /O "%USERPROFILE%\Desktop\TestFile2.txt" 
move /Y "%USERPROFILE%\Desktop\TestFile2.txt" "%USERPROFILE%\Desktop\TestFile.txt" 

Die letzte Zeile der Datei muss einen DOS/Windows-Zeilenabschluss (Wagenrücklauf \ Zeilenvorschub und Zeilenvorschub \ n) haben, wenn bei Verwendung dieser Lösung eine gerade Zeile angezeigt wird.

Um die verwendeten Befehle/ausführbare Dateien/Batch-Dateien und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehlszeilen aus und lesen Sie alle Hilfeseiten für jeden Befehl/ausführbare Datei/Batch-Datei sorgfältig durch.

  • del /?
  • echo /?
  • endlocal /?
  • findstr.exe /?
  • for /?
  • goto /?
  • if /?
  • jrepl.bat /?
  • move /?
  • set /?
  • setlocal /?

Lesen Sie auch die Microsoft Artikel über Using Command Redirection Operators für eine Erklärung der 2>nul und >>.

0

Das folgende Beispiel wird erstellen zwei Dateien aus testfile.txt, file0.out die geraden Zeilen enthält, und file1.out die ungeraden Zeilen enthält, .

@Echo Off 
SetLocal EnableDelayedExpansion 
For /F "Tokens=1* Delims=:" %%A In ('FindStr/N "^" "testfile.txt"') Do (
    Set/A "_=%%A%%2" 
    (Echo(%%B)>>file!_!.out) 

die Ausgabedateien umbenennen entsprechend Ihren Anforderungen.

+0

Ich muss dies zu Dateien in einer Datei kombinieren, wobei eine Zeile aus ungeraden Zeilen Datei, eine andere aus geraden Zeilen Datei. – andybelous2

+0

Ich muss alle ungeraden und geraden Dateien miteinander in einer Eingabe austauschen Textdatei – andybelous2

+0

Ihre Frage ist nicht klar, es fragt nach ungeraden und geraden Zeilen, Sie fragen jetzt nach ungeraden und geraden Dateien. Wenn Sie Ihren Beitrag nicht verbessern, um Ihr Problem besser zu erklären, wird er wahrscheinlich geschlossen oder erhält weiterhin Antworten, die Sie nicht befriedigen. – Compo

2

Versuchen Sie Folgendes:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 

rem // Define constants here: 
set "_FILE=textfile.txt" 

rem // Count number of lines: 
for /F %%C in ('^< "!_FILE!" find /C /V ""') do set "COUNT=%%C" 
rem // Divide by two, round up: 
set /A "COUNT=(COUNT+1)/2" 

< "!_FILE!" > "!_FILE!.tmp" (
    rem // Read files in blocks of two lines: 
    for /L %%I in (1,1,%COUNT%) do (
     set "LINE1=" & set "LINE2=" 
     set /P LINE1="" 
     set /P LINE2="" 
     echo(!LINE2! 
     echo(!LINE1! 
    ) 
) 

rem // Overwrite original file: 
> nul move /Y "!_FILE!.tmp" "!_FILE!" 

endlocal 
exit /B 
+0

Gern geschehen! Was erwartest du mit der letzten Zeile, falls die Datei eine ungerade Anzahl von Zeilen enthält? – aschipfl

0

Ich denke, die ungeraden und geraden Versionen in umgekehrter Reihenfolge neu zu verschachteln ist nicht so schwierig. Angehängt an Compo's Versuch:

Im Falle einer ungeraden Summe ist die vorletzte Zeile leer. Beispielausgabe:

2b 
1a 
4d 
3c 

5e 
Verwandte Themen