2013-04-22 2 views
2

행의 범위를 삭제해야하는 큰 텍스트 파일 (약 30,000 줄)이 있습니다 (줄 번호 5 - 30).일괄 처리 범위를 일괄 처리로 제거

많은 감사는

+0

"순수 배치"에서 수행 할 수 있지만 @ foxidrive의 제안을 더 잘 사용해야합니다. 이 경우 일괄 처리가 매우 느립니다. – Endoro

+0

@Endoro 너무 친척입니다. FOR 명령은 파일의 모든 내용을 처리 할 필요가 없습니다. 5 행부터 시작하여 30 행에서 읽는 것을 중지 할 수 있습니다. – ElektroStudios

+0

실례합니다. 이 주제는 "큰 파일에서 5 ~ 30 행을 제거하고 나머지는 반환합니다"라고 이해합니다. 25 개에서 26 개까지의 라인을 원한다면 대신 "Extract range of lines"을 사용했습니다. 내가 잘못? 죄송합니다. 영어는 모국어가 아니기 때문에 아마도이 점은 관용구적인 세부 사항입니다. – Aacini

답변

0

내가 GetRange 추가를 당신을위한 함수 :

EDIT : 결과를 얻으려면 300.000 줄의 텍스트 파일로 테스트. 2

UPDATE는 지금은하지 않는 C + C-기능, 빈 줄을 받아들입니다.

TextMan.bat

@Echo OFF 


:: TEXT MANIPULATOR ROUTINE v0.5 
:: by Elektro [email protected] 


REM SYNTAX: 
:: 
:: TEXTMAN [ACTION] [LINE(S)] [FILE] [TEXT] 
:: 
:: * [LINE(S)] parameter is Optional for some actions 
:: * [TEXT] parameter is Optional for some actions 


REM ACTIONS: 
:: 
:: AB = ADD_BEGINNING  * Add text to the beginning of a line. 
:: AE = ADD_ENDING   * Add text to the end of a line. 
:: E = ERASE    * Delete a line. 
:: I = INSERT    * Add a empty line (Or a line with text). 
:: RL = REPLACE_LINE  * Replace a entire line. 
:: RS = REPLACE_STRING  * Replace word from line. 
:: RSA = REPLACE_STRING_ALL * Replace word from all lines. 
:: C+ = CHARACTER_PLUS  * Delete the first "X" characters from all lines. 
:: C- = CHARACTER_LESS  * Delete the last "X" characters from all lines. 
:: L+ = LINE_PLUS   * Cut the first "X" amount of lines. 
:: L- = LINE_LESS   * Cut the last "X" amount of lines. 
:: GL = GET_LINE   * Delete all except "X" line. 
:: GR = GET_RANGE   * Delete all except "X" range of lines. 


REM EXAMPLES: 
:: 
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: 
::                   :: 
:: Delete the line 3              :: 
:: Call :TEXTMAN E 3 "Test.txt"           :: 
::                   ::                   
:: Add a string to the beginning of line 3         :: 
:: Call :TEXTMAN AL 3 "Test.txt" "Elektro [email protected]"       :: 
::                   ::                  
:: Add a string to the end of line 3.          :: 
:: Call :TEXTMAN AR 3 "Test.txt" "Elektro [email protected]"       :: 
::                   ::                  
:: Add a empty line at line 3.            :: 
:: Call :TEXTMAN I 3 "Test.txt"           :: 
::                   ::                  
:: Add a line with a word at line 3.          :: 
:: Call :TEXTMAN I 3 "Test.txt" "Elektro [email protected]"       :: 
::                   ::  
:: Replace the line 3 with "Elektro [email protected]".        :: 
:: Call :TEXTMAN RL 3 "Test.txt" "Elektro [email protected]"       :: 
::                   :: 
:: Replace the words "Elektro" to "[email protected]" in line 3.      :: 
:: Call :TEXTMAN RS 3 "Test.txt" "Elektro" "[email protected]"      :: 
::                   :: 
:: Replace the words "Elektro" to "[email protected]" in all lines.     :: 
:: Call :TEXTMAN RSA "Test.txt" "Elektro" "[email protected]"       :: 
::                   :: 
:: Delete the first 3 characters in all lines.        :: 
:: Call :TEXTMAN C+ 3 "Test.txt"           :: 
::                   :: 
:: Delete the last 3 characters in all lines.        :: 
:: Call :TEXTMAN C- 3 "Test.txt"           :: 
::                   :: 
:: Delete the first 3 lines.            :: 
:: Call :TEXTMAN L+ 3 "Test.txt"           :: 
::                   :: 
:: Delete the last 3 lines.            :: 
:: Call :TEXTMAN L- 3 "Test.txt"           :: 
::                   :: 
:: Delete all except the line number 3.         :: 
:: Call :TEXTMAN SL 3 "Test.txt"           :: 
::                   :: 
:: Delete all except the 3 to 9 range of lines.       :: 
:: Call :TEXTMAN SR 3 9 "Test.txt"           :: 
::                   :: 
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: 


:TEXTMAN 
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0") & (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF) 
:AB 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (if "%%B" EQU "" ((Echo %~4)>> "%~3.NEW") ELSE ((Echo %~4%%B)>> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:AE 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %%B%~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:E 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B) >> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:I 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF  "%%LINE%%" EQU "%~2" (IF NOT "%~4" EQU "" ((Echo %~4) >> "%~3.NEW") ELSE (Echo+>> "%~3.NEW"))" & (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW"))))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:RL 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:RS 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (CALL SET "STRING=%%B" &&  (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((CALL ECHO %%STRING:%~4=%~5%%)>> "%~3.NEW")))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:RSA 
(For /F "tokens=1* delims=]" %%A in ('type "%~2" ^| find /n /v ""') DO (CALL SET "STRING=%%B" && (if "%%B" EQU "" (Echo+>> "%~2.NEW") ELSE ((CALL ECHO %%STRING:%~3=%~4%%)>>"%~2.NEW")))) && (CALL :RENAMER "%~2") & (GOTO:EOF) 
:C+ 
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set "LINE=%%@" && (CALL ECHO %%LINE:~%~2%% >>  "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:C- 
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set "LINE=%%@" && (CALL ECHO %%LINE:~0,-%~2%% >> "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:L+ 
(Call SET /A "A=%~2") && (Call TYPE "%~3" |@MORE +%%A%% > "%~3.NEW") && (CALL :RENAMER "%~3") & (GOTO:EOF) 
:L- 
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%B >> "%~3.NEW")) 
:GL 
(Call SET /A "A=%~2" && Call SET /A "A-=1") && (Call TYPE "%~3" |@MORE +%%A%% > "%temp%\getline.tmp") && (For /F "tokens=1* delims=]" %%A in ('type "%temp%\getline.tmp" ^| find /n /v ""') DO ((if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)> "%~3.NEW"))) && ((CALL :RENAMER "%~3") & (GOTO:EOF))) 
:GR 
(For /F "tokens=1* delims=]" %%A in ('type "%~4" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "(IF "%%LINE%%" GEQ "%~2" IF "%%LINE%%" LEQ "%~3" (if "%%B" EQU "" (Echo+>> "%~4.NEW") ELSE ((Echo %%B)>> "%~4.NEW"))) && (IF "%%LINE%%" EQU "%~3" Exit /B 1)" || ((CALL :RENAMER "%~4") & (GOTO:EOF))))) 

:RENAMER 
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF) 

UPDATE :

만의 코드의이 부분을 사용할 필요가

내 일상 :

@Echo OFF 

Call :TEXTMAN 5 30 "TextFile.txt" 
Pause&Exit 

:TEXTMAN 
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0") & (CALL :%~1 %* || (ECHO Parametro incorrecto & Exit /B 1)) & (GOTO:EOF) 
:GR 
(For /F "tokens=1* delims=]" %%A in ('type "%~4" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "(IF "%%LINE%%" GEQ "%~2" IF "%%LINE%%" LEQ "%~3" (if "%%B" EQU "" (Echo+>> "%~4.NEW") ELSE ((Echo %%B)>> "%~4.NEW"))) && (IF "%%LINE%%" EQU "%~3" Exit /B 1)" || ((CALL :RENAMER "%~4") & (GOTO:EOF))))) 
:RENAMER 
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF) 

또는 당신은 할 수있다 단계별로 단계별로 :

012 3,516,

우리

1 ... 후 (예를 들면 5 내지 10) Y의 범위 X를 원한다면 - 제 5 개 라인을 절단하는 임시 파일에 TEXTFILE 쓰기 :

2 -에 루프를 수행 TempFile은 시작부터 줄을 다른 textfile에 쓰고 "Y"줄에 도달하면 멈 춥니 다.

@Echo OFF 

    Setlocal enabledelayedexpansion 

    Set /A "X=5" 
    Set /A "Y=10" 
    Set /A "Z=%Y%-%X%" 

    (Type "Test.txt" | MORE +%X%)>"TempFile.txt" 

    (For /F "Usebackq Tokens=*" %%# in ("TempFile.txt") Do (
     Set /A Line+=1 
     If not !Line! GTR %Z% (Echo %%#) Else (Exit) 
    ))>"MyRange.txt" 
+0

적어도 코드는 빈 줄을 보존하지 않습니다. 줄이 손상되었습니다. – foxidrive

+0

아이디어를 주셔서 감사합니다. 빈 줄을 구문 분석하도록 코드가 업데이트되었습니다. :). – ElektroStudios

+0

아직 많은 버그가 있습니다. 그것은'ON','OFF' 또는'/?'와 함께 실패한'''후행''을 제거하고''cat & dog "'이 한줄로 실패합니다 ...''Call Set '/A "LINE + = 1"'속도가 느려지므로 여기서는 유용하지 않습니다. – jeb

1

배치는 그것을 할 수 있지만, 성능 저하 및 독 문자가 문제가 될 수있을 것입니다 - 그리고 파일의 구성이 중요 할 수있다.

다운로드 GnuSed이 명령을 실행

Call :TEXTMAN SR RANGE_A RANGE_B "Test.txt" 

PS : 당신이 하나 개의 명령을을 writting 쉽게 내 루틴을 사용할 수있는 쉬운 방법을 원하는 경우

sed 5,30d "file.txt" >"file2.txt" 
+0

많은 수의 행을 읽고 인쇄 출력이 필요한 경우에만 "성능 저하"가 발생합니다. 그는 단지 5 행에서 30 행까지 읽기만하면되고, 30 행에서 파일의 내용을 읽으려면 bat 파일이 멈출 수 있습니다. – ElektroStudios

관련 문제