2012-03-29 120 views
1

如果可能,我试图避免使用PowerShell。批量修剪CSV空间的命令

寻找一种使用Windows批处理命令读取文本CSV文件(列数可能不同)并修剪空格的方法。开头和结尾的空格必须去,但其余部分必须提前

感谢保存

+0

我不知道CSV格式,但我知道批处理。如果您在批处理过程之前和之后发布CSV样本文件(有关何时删除空格的简短说明),可以编写解决方案批处理文件。 – Aacini 2012-03-29 23:54:22

+0

英美烟草公司处理很多事情相当糟糕......最穷的是字符串处理。像TRIM(......)这样的东西看起来简单易行 - 但事实上,对于BAT来说,控制这样的事情可能相当困难。这可能不是不可能的,但肯定有更好的方法。 – 2012-05-23 01:16:38

+0

这里有一些修剪实现:http://www.dostips.com/DtTipsStringManipulation.php – npocmaka 2012-06-19 19:10:46

回答

0

要删除空格 我想 - 在端线 的开始 - 之前和任何分隔

我想以后你的分隔符将通过文件保持一致,所以让它在脚本内而不是参数中。 该脚本假设值中没有分隔符(这可能发生在字符串中)。 如果你需要处理更多的特殊字符(如标签),你应该添加匹配块。 !在使用delayed expansion时替换%。我需要这样做,以便在子块中很好地解析变量。

说明:
对于每一行,请检查每种情况。
发现一个案例时,循环遍历它。

@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 

HTH 我可能不会在解释非常好,所以不介意询问详情。