2012-06-13 4 views
1

배치 파일을 작성하여 입력 텍스트 파일을 읽고, 출력 파일에 정보를 추출하고 싶습니다.입력 파일을 일괄 처리하기

  1. 입력 파일의 각 줄마다 정보가 다르므로 각 줄마다 루프를 반복하고 싶습니다.
  2. 입력 파일에서 특정 정보를 추출하고 나머지는 삭제하겠습니다.
  3. 입력 파일의 줄 수는 제한이 없습니다.
  4. 입력 줄에 유용한 정보가 없다면 오류 메시지를 남기고 싶습니다.
  5. 두 개의 카운터가 필요합니다. 첫 번째는 입력 파일의 줄 수를 나타내고 두 번째 줄은 출력 파일의 줄 수를 나타냅니다 (빈 줄 수 없음).
  6. 일괄 처리에서 특수 문자를 일반 문자처럼 처리하고 싶습니다. 예를 들어

:

나는 그 라인에 다른 모든 것을 버리고 만 FILE_NAME=XXXFILE_SIZE=XXX 부분을 추출 할
FILE_NAME=apple FILE_SIZE=312  C=fwef sdf asdetg 

FILE_SIZE=7867 C=ehtrghr FILE_NAME=sea&ocean G=tryr yujg 
C=gert FILE_NAME=chair=12 tgrgd sfsf FILE_SIZE=66 
dfgg ertergf C=ert A=344 

fgdfg FILE_NAME=cat 

. 출력은 다음과 같아야합니다.

-name apple -size 312 
-name sea&ocean -size 7867 
-name chair=12 -size 66 
ERROR!!! 
-name cat 

input_count=5 and output_count=4 
+0

나는 이것이 배치 파일 방법이 아니라는 것을 알고있다. 아마도 적합하지 않을 것이다. 그러나 awk와 sed는 이것과 같은 텍스트 줄을 다시 정렬하기위한 (리눅스) 명령 줄 도구이다. – Chris

+0

UnixUtils 프로젝트에서'sed'와'awk' 버전을 다운로드하고 배치 파일에서 사용할 수 있습니다. – adarshr

답변

2

사람들은 배치 스크립트에 충분한 점수를주지 못합니다. 이 시도 : 여기

@echo off 
setlocal enableDelayedExpansion 
set INPUT_FILE=input.txt 
set OUTPUT_FILE=output.txt 
set INPUT_COUNT=0 
set OUTPUT_COUNT=0 

:: Read the input file 
for /f "tokens=*" %%s in (%INPUT_FILE%) do call :ParseLine "%%s" 
echo. >>%OUTPUT_FILE% 
echo input_count=!INPUT_COUNT! and output_count=!OUTPUT_COUNT! >>%OUTPUT_FILE% 
exit /b 

:: Parse one line and write to output 
:ParseLine 
set "str=%~1" 
set ^"str=!str: =^ 

!" 
set file_name= 
set file_size= 
for /f "eol= tokens=1,2 delims==" %%a in ("!str!") do (
    set "tag=%%a" 
    set "value=%%b" 
    if "!tag!" equ "FILE_NAME" set "file_name=-name !value!" 
    if "!tag!" equ "FILE_SIZE" set "file_size=-size !value!" 
) 
set /a input_count+=1 
if "!file_name!" equ "" if "!file_size!" equ "" (
    echo ERROR^^!^^!^^! >>%OUTPUT_FILE% 
    goto Done 
) 
echo.!file_name! !file_size! >>%OUTPUT_FILE% 
set /a output_count+=1 
:Done 

이가하는 일에 대해 조금 설명입니다 :

  1. 첫 번째 for 루프 라인으로 파일 라인을 읽고, 각 라인의 내용은 ParseLine 서브 루틴에 입력 인수로 전송되는 .
  2. ParseLine 서브 루틴은 str에있는 각 줄을 받고 공백으로 분리 된 단어를 반복합니다 (here에 설명 된 jeb의 고급 방법 사용). 이 tag (= 앞에 텍스트)와 value (= 다음 텍스트)에 각 단어를 분해하고, 따라서 file_namefile_size과를 설정
    서브 루틴 루프의 로직은 매우 간단하다.

이 방법은 특수 문자의 유무에 관계없이 모든 입력 파일을 처리 할 수 ​​있다고 생각합니다.

+0

괜찮지 만 모든 변수 FILE_NAME & FILE_SIZE에 대해 변경되지만 그 중 하나에 대해 수행하려합니다 – Leo92

+0

@ user1447199 - 질문을 완전히 바꾸지 말고 더 잘 질문하십시오. XML, CSV 또는 사용자 정의 형식 인 경우 큰 차이가 있습니다 – jeb

+0

도움말 plz, 입력 파일 이름에/f의 "tokens = *"%% s에이 줄에 공백이 있으면 문제가 있음을 발견했습니다 (% INPUT_FILE %) do call : ParseLine "%% s", "% INPUT_FILE %"을 넣으려고했으나 제대로 작동하지 않았습니다. 해결책이 있습니까? – Leo92

관련 문제