这是我的第一个批处理程序,我一直在网上搜索,但仍在努力编写解决方案。

我有以下CSV文件:

"RH",2013/06/15 02:14:58 -0400,"X","LQ3SUEEWPWKL6",005,
"FH",01
"SH",2013/06/14 00:00:00 -0400,2013/06/14 23:59:59 -0400,"LQ3SUEEWPWKL6",""
"CH","TransactionID","InvoiceID",
......

我正在尝试编写一个简单的程序来执行以下操作:
  • 如果column1 =“RH”,则提取column2值(2013/06/15 02:14:58 -0400)
  • 如果column1 =“SH”,则提取column4值(LQ3SUEEWPWKL6)

  • 并通过管道将其输出到文件中。

    到目前为止,这是我的代码,但是if条件对我不起作用
    @echo off
    :: Set input file in variable
    ::Set _InputFile=%1
    
    :: Store input line into different variables
    FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
    Set _var1=%%A
    Set _var2=%%B
    Set _var3=%%C
    Set _var4=%%D
    Set _var5=%%E
    Set _var6=%%F
    Set _var7=%%G
    Set _var8=%%H
    Set _var9=%%I
    Set _var10=%%J
    Set _var11=%%K
    Set _var12=%%L
    Set _var13=%%M
    Set _var14=%%N
    Set _var15=%%O
    Set _var16=%%P
    Set _var17=%%Q
    Set _var18=%%R
    
    
    IF "%_var1%"=="RH" echo %var2%
    
    )
    

    我的CSV文件在Excel和记事本中看起来不错,但是当我执行脚本以显示第一个变量时,似乎在第一条记录的“RH”之前有一些垃圾字符-我无法绕过它,因为我需要提取其他列var1 =“RH”时的数据:
    "RH"
    FH
    01
    SH
    CH
    TransactionID,PaymentTrackingID,
    SF
    SF
    SC
    RF
    CAD,CR,0
    RF
    USD,CR,0
    RC
    FF
    

    最佳答案

    (
    FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
      if "%%~A"=="RH" echo %%~B
      if "%%~A"=="SH" echo %%~D
     )
    )>youroutputfilename
    

    应该可以工作-无需将所有值分配给不同的变量-但如果您打算使用它们,则
    FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
    ...
    Set _var17=%%Q
    Set _var18=%%R
    CALL :PROCESS
    )
    ...
    GOTO :EOF
    
    :PROCESS
    IF %_var1%=="RH" echo %_var2%
    IF %_var1%=="SH" echo %_var4%
    GOTO :EOF
    

    请注意,使用此方法时,由于您将%%x分配给_varx,因此如果用%%x引号,则引号将包含在所分配的值中。要删除封闭的引号(如果存在),请使用SET _varx=%%~x

    附录20130703-1956Z用于OP的问题
    @ECHO OFF
    SETLOCAL
    SET _Inputfile=u:\noname1.txt
    (
    FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
      SET "RH="
      SET "SH="
      ECHO(%%A|FINDSTR /l /c:"\"RH\"" >NUL
      IF NOT ERRORLEVEL 1 SET RH=Y
      ECHO(%%A|FINDSTR /l /c:"\"SH\"" >NUL
      IF NOT ERRORLEVEL 1 SET SH=Y
      if DEFINED RH echo %%~B
      if DEFINED SH echo %%~D
     )
    )>u:\youroutputfilename
    TYPE u:\youroutputfilename
    del u:\youroutputfilename
    echo========First way
    
    (
    FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
      SET _var1=%%A
      SET "RH="
      SET "SH="
      CALL :process
      if DEFINED RH echo %%~B
      if DEFINED SH echo %%~D
     )
    )>u:\youroutputfilename
    
    TYPE u:\youroutputfilename
    del u:\youroutputfilename
    echo========Second way
    
    SETLOCAL ENABLEDELAYEDEXPANSION
    (
    FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
      SET _var1=%%A
      IF "!_var1:~-4!"==""RH"" echo %%~B
      IF "!_var1:~-4!"==""SH"" echo %%~D
     )
    )>u:\youroutputfilename
    
    TYPE u:\youroutputfilename
    del u:\youroutputfilename
    echo========Third way
    ENDLOCAL
    
    GOTO :EOF
    
    :process
    IF "%_var1:~-4%"==""RH"" SET RH=Y
    IF "%_var1:~-4%"==""SH"" SET SH=Y
    GOTO :EOF
    

    10-04 22:54
    查看更多