2012-03-29 5 views
1

가능한 경우 PowerShell을 피하려고합니다.CSV에서 공백을 제거하는 일괄 처리 명령

Windows 배치 명령을 사용하여 텍스트 CSV 파일 (열 수는 다를 수 있음)을 읽는 방법을 찾고 공백을 잘라냅니다. 선행 및 후행 공백이 이동해야하지만, 나머지는 사전에

감사를 보존해야 당신이 공간을 을 제거한다고 가정

+0

CSV 형식을 모르지만 배치를 알고 있습니다. 공백을 제거 할시기에 대한 간단한 설명과 함께 일괄 처리 전후에 샘플 CSV 파일을 게시하면 솔루션 일괄 처리 파일을 작성할 수 있습니다. – Aacini

+0

BAT는 많은 것들을 상당히 잘 처리하지 못하고 ... 가장 가난한 부분은 문자열 처리입니다. 트림 (TRIM)과 같은 것은 죽은 듯 단순한 것처럼 보이지만 실제로 그러한 일을 제어하는 ​​BAT는 상당히 어려울 수 있습니다. 아마 불가능하지는 않지만 확실히 좋은 방법이 있습니다. –

+0

여기 몇 가지 트림 구현이 있습니다. http://www.dostips.com/DtTipsStringManipulation.php – npocmaka

답변

0

- 끝 라인 의 시작 - 전

내가 생각 어떤 분리 후 구분 기호는 파일을 통해 일관성이 있으므로 매개 변수 대신 스크립트 내부에서 사용하십시오. 스크립트는 값 내에 분리 문자가 없다고 가정합니다 (문자열과 함께 발생할 수 있음). 더 많은 특수 문자 (예 : 탭)를 처리해야하는 경우 일치하는 블록을 추가해야합니다. ! delayed expansion을 사용할 때 %를 대체하십시오. 변수가 하위 블록에서 잘 파싱되도록이 작업을 수행해야했습니다.

설명 :
각 줄마다 각 경우를 확인하십시오.
사례가 발견되는 동안 사례가 반복됩니다. 내가 설명하는 매우 좋은하지 않을 수 있으므로 자세한 내용은 물어 괜찮다 HTH

@echo off 
setlocal enabledelayedexpansion 
:: Remove spaces from csv 
:: ARGS: 
:: 1 : file name of the CSV file 

set _SEP=; 
dir /b %1 2>&1 >nul 
if ERRORLEVEL 1 echo ERROR : File not found & goto :EOF 

del %1.trimmed 2>nul 

for /f "delims=%_SEP% tokens=*" %%L in (%1) do (
echo before: %%L 
set _LINE=%%L 

call :CHECK_BEFORE 
call :CHECK_AFTER 
call :CHECK_BEGIN 
call :CHECK_END 

echo !_LINE! >> %1.trimmed 
) 

echo END of TRIM 
echo output is in %1.trimmed 
goto :EOF 


:TRIM_BEFORE_SEP 
set _LINE=!_LINE: ;=;! 
goto :EOF 

:TRIM_AFTER_SEP 
set _LINE=!_LINE:; =;! 
goto :EOF 

:TRIM_BEGIN 
set _LINE=!_LINE:~1! 
goto :EOF 

:TRIM_END 
set _LINE=!_LINE:~0,-1! 
goto :EOF 

:CHECK_BEFORE 
echo !_LINE! | findstr /C:" ;" 
if %ERRORLEVEL% == 0 call :TRIM_BEFORE_SEP & goto CHECK_BEFORE 
echo End Step: Trim Before Sep 
goto :EOF 

:CHECK_AFTER 
echo !_LINE! | findstr /C:"; " 
if %ERRORLEVEL% == 0 call :TRIM_AFTER_SEP & goto CHECK_AFTER 
echo End Step: Trim After Sep 
goto :EOF 

:CHECK_BEGIN 
if "!_LINE:~0,1!" == " " call :TRIM_BEGIN & goto CHECK_BEGIN 
echo End Step: Trim Begin 
goto :EOF 

:CHECK_END 
if "!_LINE:~-1!" == " " call :TRIM_END & goto CHECK_END 
echo End Step: Trim End 
goto :EOF 

.

관련 문제