帮助编写批处理脚本来解析CSV文件并输出文本文件

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个令牌.请帮忙!

And*_*y M 7

@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" …列表,同样,如果你减少了数字,然后缩小列表).


Aac*_*ini 7

我知道这是一个老问题,但这类问题是我最喜欢的问题,所以这里是我的答案:

@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)

该程序对字段数没有任何限制.此版本需要在引号中包含可能包含空格或其他批处理分隔符的元素,但可以轻松修复此限制.

  • 批处理文件参数和FOR集的标准分隔符可以是逗号,分号或等号(除了空格),因此没有必要显式检查逗号.但是,如果标题或元素可能具有这些字符,则可能会出现问题(正如我在回答中所写). (2认同)