使用批处理文件解析csv文件中的行
更新: 我想解析一个csv文件并处理这些信息。在打开文件之前,我不知道行中的元素数。我不知道行数。我想首先解析头,这样我就可以知道使用哪个令牌来解析行。我希望得到矩阵形式的结果,因此很容易使用 我还想创建一个csv,以便以后导出我的结果 下面是我想要解析的csv示例(限制为3行10列) 我事先不知道行数和列数。我也不知道列的顺序。假设我想使用帐号、观察月和利率,首先我想解析标题以获得位置3,5,9,这样我可以在解析其他行以获取信息时将它们用作标记 我成功地完成了一半我想做的事情,这是我写的代码(现在,我只是读和写,以后我只保留我感兴趣的变量并进行额外的计算): 但我仍然有两个问题:使用批处理文件解析csv文件中的行,csv,parsing,batch-file,command-line,cmd,Csv,Parsing,Batch File,Command Line,Cmd,更新: 我想解析一个csv文件并处理这些信息。在打开文件之前,我不知道行中的元素数。我不知道行数。我想首先解析头,这样我就可以知道使用哪个令牌来解析行。我希望得到矩阵形式的结果,因此很容易使用 我还想创建一个csv,以便以后导出我的结果 下面是我想要解析的csv示例(限制为3行10列) 我事先不知道行数和列数。我也不知道列的顺序。假设我想使用帐号、观察月和利率,首先我想解析标题以获得位置3,5,9,这样我可以在解析其他行以获取信息时将它们用作标记 我成功地完成了一半我想做的事情,这是我写的代码(
- 我最初的出口方式与我在中国的出口方式相同 :EchoHeader,但速度非常慢,因此我决定首先连接 元素并超出整行(请参见:EchoData)。问题是 我得到一个错误,无法导出;我不明白为什么。当我回音 !_瓦尔!并在中取消注释我的for循环的最后三行 :EchoData,我可以看到_var是我想要的,但是当被评论时,它 只是虫子李>
- 下一个/下一个bis循环正在运行,即使没有任何循环
让我读下去,我想我的goto:eof会避免这种情况,但我 显然错过了什么,我现在找不到什么
ps:我不认为我的代码是最优的,任何提高运行时间的想法都是值得赞赏的:)子例程/函数是构建代码的好方法,但是:
- 您必须注意程序不会无意中进入它们。在前面插入一个
goto:eof
- 在子函数/函数的末尾还插入一个
,以将控制权返回给调用者goto:eof
- 不要在代码块内使用标签,除非您知道自己在做什么。改用REMs
- 要读取文件的第一行,只需使用
set/P“header=“
子例程/函数是构造代码的好方法,但是:
- 您必须注意程序不会无意中进入它们。在前面插入一个
goto:eof
- 在子函数/函数的末尾还插入一个
,以将控制权返回给调用者goto:eof
- 不要在代码块内使用标签,除非您知道自己在做什么。改用REMs
- 要读取文件的第一行,只需使用
set/P“header=”您到底有什么问题?输入的CSV文件是什么样子的?谢谢,我忘了,它现在被添加了
后缀是什么?并请提供一个示例输出文件和相关的用户输入。顺便说一句,如果没有定义,%=%
应该实际读取行“%\u fileOut%”set“\u fileOut=con”
(假设您想检查变量是否为空)…这是用于用户输入的,因此他可以填写我保留的数据文件地址,如果没有定义“%\u fileOut%”set,这就可以工作。我不应该用%%来表示文件输出吗?你到底有什么问题?输入的CSV文件是什么样子的?谢谢,我忘了,它现在被添加了如果没有定义,\u fileOut set“\u fileOut=con”
后缀是什么?并请提供一个示例输出文件和相关的用户输入。顺便说一句,如果没有定义,%=%
应该实际读取行“%\u fileOut%”set“\u fileOut=con”
(假设您想检查变量是否为空)…这是用于用户输入的,因此他可以填写我保留的数据文件地址,如果没有定义“%\u fileOut%”set,这就可以工作。我不应该用%%来引用_fileOut吗?谢谢:-添加了goto:eof before&after,尽管我不知道为什么它会有帮助;-改为rem。再说一次,它有什么帮助?I&机器仍然将其视为注释并解释为注释;-向用户询问文件地址是因为地址和名称未知。没有比这更好的方法了;-递归解析,因为列数未知。方法是读取第一个元素(如果存在)并测试行尾,如果不与行的其余部分迭代,则测试行尾。谢谢:-添加了goto:eof before&after,尽管我不确定它有什么帮助;-改为rem。再说一次,它有什么帮助?I&机器仍然将其视为注释并解释为注释;-向用户询问文件地址是因为地址和名称未知。没有比这更好的方法了;-递归解析,因为列数未知。其思想是读取第一个元素(如果存在)并测试行尾,如果不与行的其余部分进行迭代,直到行尾。如果没有定义,\u fileOut set“\u fileOut=con”
"","rim_no","account_no","observation_date","observation_month","start_date","maturity_date","days_past_due","rate","spread" "1",2517,1000008332,20160831,201608,NA,NA,0,17,0 "2",2517,1000008332,20160930,201609,NA,NA,0,17,0
@ECHO off SETLOCAL EnableDelayedExpansion :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::Adress of the input and output files GOTO InFile :FalseIN ECHO You need to enter a valid location for the source file. GOTO InFile :InFile ECHO Please enter the location of your file in like C:\XXXX\YYYY\ZZZZ\example.csv SET _fileIn SET /P _fileIn=Type input: %=% IF NOT EXIST "%_fileIn%" GOTO FalseIn ECHO The selected input file to work with is %_fileIn% :OutFile ECHO Please enter the name of your output like C:\XXXX\YYYY\ZZZZ\output.csv SET _fileOut SET /P _fileOut=Type input: %=% IF NOT EXIST "%_fileOut%" set "_fileOut=C:\XXXX\YYYY\ZZZZ\Output.csv" ECHO.>"%_fileOut%" ECHO The selected output file to work with is %_fileOut% ECHO stop 1 @PAUSE SET _ligne=0 SET _colonne=0 CALL :ParseHeader "%_fileIn%" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: GOTO :eof ::Parse input file header, first element :ParseHeader SET /a _countParse+=1 SET _list=%1 SET _list=%_list:"=% FOR /F "tokens=1* delims=, " %%a IN ('TYPE "%_list%"') DO ( set _matrice[%_ligne%][%_colonne%]=%%a set /a _colonne+=1 if not "%%b"=="" call :ParseHeaderBis "%%b" ) GOTO :eof ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: GOTO :eof ::Parse input file header, from second element onward :ParseHeaderBis SET /a _countParseBis+=1 SET _list=%1 SET _list=%_list:"=% FOR /F "tokens=1* delims=, " %%a IN ("%_list%") DO ( set _matrice[%_ligne%][%_colonne%]=%%a if not "%%b"=="" set /a _colonne+=1 if not "%%b"=="" if %_ligne% equ 0 call :ParseHeaderBis "%%b" if "%%b"=="" set /a _ligne+=1 ) @PAUSE IF %_ligne% gtr 0 GOTO :EchoHeader GOTO :eof :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :EchoHeader FOR /L %%H IN (0,1,%_colonne%) DO ( echo|set /p=!_matrice[0][%%H]!>>%_fileOut% if not %%H equ %_colonne% echo|set /p=,>>%_fileOut% if %%H equ %_colonne% echo.>>%_fileOut% ) @PAUSE CALL :Next :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: GOTO :eof ::Parse input file data, from second row onward, get lines :Next SET /a _countNext+=1 SET /a _ligneAct=%_ligne% SET _colonne=0 FOR /F "skip=%_ligne% tokens=* delims=" %%a IN ('type "%_fileIn%"') DO ( if not "%%a"=="" call :NextBis "%%a" if "%%a"=="" goto :eof ) GOTO :eof :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: GOTO :eof ::Parse the lines from the input file :NextBis SET /a _countNextBis+=1 SET _list=%1 SET _list=%_list:"=% FOR /F "tokens=1* delims=, " %%a IN ("%_list%") DO ( set _matrice[%_ligne%][%_colonne%]=%%a if not "%%b"=="" set /a _colonne+=1 if not "%%b"=="" if %_ligne% equ %_ligneAct% call :NextBis "%%b" if "%%b"=="" set /a _ligne+=1 ) IF %_ligne% gtr %_ligneAct% GOTO :EchoData GOTO :eof :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :EchoData SET _var="" FOR /L %%H IN (0,1,%_colonne%) DO ( if %%H equ 0 set _var=!_matrice[%_ligneAct%][%%H]! set _help=!_var! if %%H gtr 0 set _var=!_help!, !_matrice[%_ligneAct%][%%H]! echo !_var! if %%H equ %_colonne% echo !_var!>>%_fileOut% ::echo|set /p=!_matrice[%_ligneAct%][%%H]!>>%_fileOut% ::if not %%H equ %_colonne% echo|set /p=,>>%_fileOut% ::if %%H equ %_colonne% echo.>>%_fileOut% ) @PAUSE CALL :Next :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :eof @PAUSE
- 您必须注意程序不会无意中进入它们。在前面插入一个