Ben*_*nny 8 windows csv text record batch-file
我正在努力编写一个可以读取CSV文件的批处理脚本,如下所示
Name:, City:, Country:
Mark, London, UK
Ben, Paris, France
Tom, Athens, Greece
Run Code Online (Sandbox Code Playgroud)
CSV文件中将有一个标题行.它应输出到文本文件,如下所示:
Name:Mark
City:London
Country:UK
Name:Ben
City:Paris
Country:France
Name:Tom
City:Athens
Country:Greece
Run Code Online (Sandbox Code Playgroud)
上述输出中的字段分隔符(:)应该在标题行本身中提供.所以我需要做的就是连接字段标题及其值.
此CSV文件中的列数不固定,因此脚本不应限制为3个令牌.请帮忙!
@ECHO OFF
IF "%~1"=="" GOTO :EOF
SET "filename=%~1"
SET fcount=0
SET linenum=0
FOR /F "usebackq tokens=1-10 delims=," %%a IN ("%filename%") DO ^
CALL :process "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g" "%%h" "%%i" "%%j"
GOTO :EOF
:trim
SET "tmp=%~1"
:trimlead
IF NOT "%tmp:~0,1%"==" " GOTO :EOF
SET "tmp=%tmp:~1%"
GOTO trimlead
:process
SET /A linenum+=1
IF "%linenum%"=="1" GOTO picknames
SET ind=0
:display
IF "%fcount%"=="%ind%" (ECHO.&GOTO :EOF)
SET /A ind+=1
CALL :trim %1
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !f%ind%!!tmp!
ENDLOCAL
SHIFT
GOTO display
:picknames
IF %1=="" GOTO :EOF
CALL :trim %1
SET /a fcount+=1
SET "f%fcount%=%tmp%"
SHIFT
GOTO picknames
Run Code Online (Sandbox Code Playgroud)
这批scipt:
接受一个参数,要处理的文件的名称;
不会验证:标头令牌末尾是否存在,并且当显示这些值时,它们会立即放置在相应的标头令牌之后;
修剪所有前导空格(但不是尾随空格);
将第一行视为标题行,它还定义了后续行中要处理的标记数;
最多支持10个令牌,以粗体斜体突出显示的两个区域负责(因此当您需要更改最大数量时,请修改两个区域:如果增加数量,则必须展开"%%a" "%%b" "%%c" …列表,同样,如果你减少了数字,然后缩小列表).
我知道这是一个老问题,但这类问题是我最喜欢的问题,所以这里是我的答案:
@echo off
setlocal EnableDelayedExpansion
rem Create heading array:
set /P headingRow=< %1
set i=0
for %%h in (%headingRow%) do (
set /A i+=1
set heading[!i!]=%%~h
)
rem Process the file:
call :ProcessFile < %1
exit /B
:ProcessFile
set /P line=
:nextLine
set line=:EOF
set /P line=
if "!line!" == ":EOF" goto :EOF
set i=0
for %%e in (%line%) do (
set /A i+=1
for %%i in (!i!) do echo !heading[%%i]!%%~e
)
goto nextLine
exit /B
Run Code Online (Sandbox Code Playgroud)
该程序对字段数没有任何限制.此版本需要在引号中包含可能包含空格或其他批处理分隔符的元素,但可以轻松修复此限制.