2017-10-02 1 views
0

항상 같은 위치에있는 쉼표 (CSV)로 구분 된 배치 또는 vbs 텍스트로 삭제하려고합니다. 첫 번째 줄에는 영향을 미치지 않고 두 번째 줄만 영향을줍니다. 파일에서쉼표로 구분 된 문자 삭제/바꾸기

예제 텍스트 :

Code,Batch,File #,Reg Hours,O/T,Cost Number,Rate,Earnings,Earnings,Memo Code,Memo Amount,Earnings Code,Earnings Amount,Hours Code,Hours Amount,Earnings Code,Earnings Amount,Adjust Code,Adjust Amount 
ABC,123,3980 ,78.52,,12331,10.00,,,,,,,, 
ABC,123,4026 ,29.38,,12331,10.00,,,,,,,, 
ABC,123,5065 ,64.46,,12331,10.00,,,,,,,, 
ABC,123,5125 ,80.00, 0.54,12331,11.00,,,,,,,, 

나는 텍스트를 끝내고 싶습니다

Code,Batch,File #,Reg Hours,O/T,Cost Number,Rate,Earnings,Earnings,Memo Code,Memo Amount,Earnings Code,Earnings Amount,Hours Code,Hours Amount,Earnings Code,Earnings Amount,Adjust Code,Adjust Amount 
ABC,123,3980 ,78.52,,12331,,,,,,,,, 
ABC,123,4026 ,29.38,,12331,,,,,,,,, 
ABC,123,5065 ,64.46,,12331,,,,,,,,, 
ABC,123,5125 ,80.00, 0.54,12331,,,,,,,,, 

유일한 차이점은 속도 영역입니다. 왼쪽에서 7 번째로 분리 된 값이거나 오른쪽에서 9 번째 값입니다. 첫 번째 줄은 그대로 유지됩니다.

배치/vbs가 쉼표로 구분 된 값 위치를 결정하고 값을 삭제하거나 '아무것도'로 바꾸고 첫 번째 줄을 무시할 수있는 방법이 있습니까? 이 예를 들어

, 우리는 파일이 항상 file.csv 이름 및 D에 위치 할 것으로 가정 할 수 있습니다 : \ 위치 - 'D : \ 위치 \의 file.csv'

감사합니다!

답변

0
REM <!-- language: lang-dos --> 
@ECHO Off 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q46534752.txt" 
SET "outfile=%destdir%\outfile.txt" 

:: Remove the output file 

DEL "%outfile%" >NUL 2>nul 

:: To reproduce the first line intact 

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO >"%outfile%" ECHO %%a&GOTO hdrdone 

:hdrdone 

(
REM to process the header line, remove the "skip=1" from the "for...%%a" command 
FOR /f "usebackqskip=1delims=" %%a IN ("%filename1%") DO (
REM step 1 - replace all commas with "|," to separate separators 
SET "line=%%a" 
SET "line=!line:,=|,!" 
FOR /f "tokens=1-7*delims=|" %%A IN ("!line!") DO (
    SET "line=%%A%%B%%C%%D%%E%%F%%H" 
    ECHO !line:^|=! 
) 
) 
)>>"%outfile%" 

GOTO :EOF 

당신은 당신의 상황에 맞게 sourcedirdestdir의 설정을 변경해야합니다.

테스트 용 데이터가 포함 된 q46534752.txt 파일을 사용했습니다.

는 문제 헤더 라인

가공 %의 OUTFILE의 %로서 정의 파일을 생성. 제시된 코드는 사용자가 요청할 때 수행해야하지만 프로세스가 해당 열을 제거하려고 할 때 결과 파일에 열 이름을 유지하는 것은 비합리적입니다. 헤더 행을 처리하려면 첫 번째 for 행을 삭제하고 두 번째 줄에서 skip=1 (첫 번째 행을 건너 뜁니다)을 제거하십시오.

기본적으로 배치는 구분 기호 문자열을 단일 구분 기호로 처리하므로 구분 기호를 구분해야합니다. 이것은 metavariable에 대해 가능하지 않지만 metavariable을 일반 환경 변수 (line)로 전송하고 delayed expansion 모드의 일반 변수에 대해 문자열 바꾸기 식을 수행하여 루프 내에서 수행 할 수 있습니다.

따라서 ,을 각각 |,으로 바꾼 다음 |을 구분 기호로 사용하여 결과 문자열을 처리하십시오. metavariable은 두 번째 for의 경우가 다른 경우가 있는데, cmd은 대소 문자를 구분합니다. 열 7 (%% G)을 생략하고 8 번째 토큰 (%% H)이 명시 적으로 언급 된 가장 높은 토큰 번호 (7) 다음에 나머지 행을 받고 나머지는 제거한 후 echo을 의미하는 * 토큰을 사용하여 문자열을 재구성하십시오 | 자입니다.

SO에 대한 코드 요청을 거절하고 오류 코드를 수정하는 방식으로 만 응답하는 것은 일반적인 정책입니다. 그러나이 경우, 후속 브라우저는이 응답을 유사한 작업을 수행하는 데 사용하는 키로 사용할 수 있으므로 불필요하게 게시하지 않아도됩니다. 또한, 나는 지루하지 않다.