Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 用于在CSV中修剪空格的批处理命令_Batch File_Cmd_Dos - Fatal编程技术网

Batch file 用于在CSV中修剪空格的批处理命令

Batch file 用于在CSV中修剪空格的批处理命令,batch-file,cmd,dos,Batch File,Cmd,Dos,如果可能的话,我会尽量避免使用PowerShell 正在寻找一种使用Windows批处理命令读取文本CSV文件(列数可能不同)并修剪空格的方法。必须去掉前导空格和尾随空格,但必须保留其余空格 提前谢谢我想您想删除空格 -在行尾和行首 -任何分离器前后 我想您的分隔符在文件中是一致的,所以将其放在脚本中而不是参数中。 脚本假设值中没有分隔符(这可能发生在字符串中)。 如果需要处理更多特殊字符(如tab),则应添加匹配块。 ! 使用时替换%。我需要这样做,以便在子块中很好地解析变量 说明: 对于每一

如果可能的话,我会尽量避免使用PowerShell

正在寻找一种使用Windows批处理命令读取文本CSV文件(列数可能不同)并修剪空格的方法。必须去掉前导空格和尾随空格,但必须保留其余空格


提前谢谢

我想您想删除空格 -在行尾和行首 -任何分离器前后

我想您的分隔符在文件中是一致的,所以将其放在脚本中而不是参数中。 脚本假设值中没有分隔符(这可能发生在字符串中)。 如果需要处理更多特殊字符(如tab),则应添加匹配块。 ! 使用时替换%。我需要这样做,以便在子块中很好地解析变量

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

@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

我可能不太擅长解释,所以不介意询问细节。

我想您想删除空格 -在行尾和行首 -任何分离器前后

我想您的分隔符在文件中是一致的,所以将其放在脚本中而不是参数中。 脚本假设值中没有分隔符(这可能发生在字符串中)。 如果需要处理更多特殊字符(如tab),则应添加匹配块。 ! 使用时替换%。我需要这样做,以便在子块中很好地解析变量

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

@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

我可能不太擅长解释,所以不介意询问细节。

我不知道CSV格式,但我知道批处理。如果在批处理之前和之后发布一个示例CSV文件(并简要说明何时删除空格),则很有可能编写一个解决方案批处理文件。BAT处理很多事情都相当糟糕……而最糟糕的是字符串处理。像TRIM(…)这样的东西看起来非常简单——但事实上,对于蝙蝠来说,控制这样的事情可能相当困难。这可能不是不可能的,但肯定有更好的方法。下面是一些trim实现:我不知道CSV格式,但我知道批处理。如果在批处理之前和之后发布一个示例CSV文件(并简要说明何时删除空格),则很有可能编写一个解决方案批处理文件。BAT处理很多事情都相当糟糕……而最糟糕的是字符串处理。像TRIM(…)这样的东西看起来非常简单——但事实上,对于蝙蝠来说,控制这样的事情可能相当困难。这可能不是不可能的,但肯定有更好的方法。以下是一些trim实现: