使用批处理文件解析csv文件中的行

使用批处理文件解析csv文件中的行,csv,parsing,batch-file,command-line,cmd,Csv,Parsing,Batch File,Command Line,Cmd,更新: 我想解析一个csv文件并处理这些信息。在打开文件之前,我不知道行中的元素数。我不知道行数。我想首先解析头,这样我就可以知道使用哪个令牌来解析行。我希望得到矩阵形式的结果,因此很容易使用 我还想创建一个csv,以便以后导出我的结果 下面是我想要解析的csv示例(限制为3行10列) 我事先不知道行数和列数。我也不知道列的顺序。假设我想使用帐号、观察月和利率,首先我想解析标题以获得位置3,5,9,这样我可以在解析其他行以获取信息时将它们用作标记 我成功地完成了一半我想做的事情,这是我写的代码(

更新:

我想解析一个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“\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&机器仍然将其视为注释并解释为注释;-向用户询问文件地址是因为地址和名称未知。没有比这更好的方法了;-递归解析,因为列数未知。其思想是读取第一个元素(如果存在)并测试行尾,如果不与行的其余部分进行迭代,直到行尾。
      "","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