从csv文件读取并根据第一列值提取某些数据列

这是我的第一批程序,我一直在网上search,但仍然在努力写出一个解决scheme。

我有以下的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”,则提取第4列值(LQ3SUEEWPWKL6)

和pipe道输出到一个文件。


这是我的代码到目前为止,但如果条件不适合我

 @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和记事本中看起来不错,但是当我执行脚本来显示第一个variables时,它看起来就像在第一个logging上的“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


对于OP的问题附录20130703-1956Z

 @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 

你有一个解析问题。 首先结束for循环)之后你可以使用新的变量:

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

您需要启用延迟扩展 :

 @echo off setlocal EnableDelayedExpansion set "_InputFile=..." for /f "tokens=1-18* delims=," %%A in (%_InputFile%) do ( Set _var1=%%A Set _var2=%%B ... if " !_var1! "=="RH" echo !_var2! ) 

因为“我的线为什么以∩╗┐”RH“开头,所以没有答案,我会做一些掘墓工作。

所以,∩╗┐来自BOM(字节顺序标记),它表示文件是UTF文件,以及必要时写入字节的方式。 为答案:你可以使用

 if x%_var1:RH=%x NEQ x%_var1%x (echo %_var2%) 

这将检查RH是否在%_var1%(如果在var中更换RH之后,它不变,RH不在var中),这意味着Bom是否在这里并不重要。 但是,如果您想要完全匹配,则会遇到问题。

处理这个问题的另一个方法就是不要在你的文件中包含bom,这意味着不用BOM就可以保存为ASCII或UTF-8; 或者使用一个工具从你的UTF-8文件中删除。