2013-07-04 97 views
7

这是我的第一批程序,我一直在线上搜索,但仍在努力写出解决方案。从csv文件读取并根据第一列值提取某些数据列

我有以下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", 
...... 

我试图写一个简单的程序来执行以下操作:

  • 如果列1 = “RH”,然后提取COLUMN2值( 2013年6月15日2时14分58秒-0400)
  • 如果列1 = “SH”,然后抽取column4值(LQ3SUEEWPWKL6)

和管道输出到文件。


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

@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 
+1

你试过了什么?你有多远? – dnet

+0

这是我到目前为止,但“如果”条件不起作用。 – user2550880

+0

你的意思是:如果“%_var1%”==“RH”echo%_var2%'?我没有看到'var2'(即没有前面的'_')。 – Rapnar

回答

10
(
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然后​​如果%%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 
+0

谢谢 - 我选择了你的第一个示例代码,因为它是最简单的代码。第一条记录在_var1中有垃圾字符,如何摆脱它,因为它不打印var2 – user2550880

+0

没有真正看到有问题的记录,也没有任何垃圾字符的概念,我不知所措。如果它是一个标题记录,那么在'FOR/f'指令中包含'skip = 1'应该忽略该行。还要注意,既然你没有执行'setlocal',你可能正在处理之前运行的陈旧值 - ** IF **你正在使用'_var1' - 但我很困惑 - 如果你使用第一个例如,避免在任何情况下设置'_varx',为什么'_var1'的值是重要的?或者你指的是数据文件中第一行第一个元素的值? – Magoo

+0

我已经添加了一些示例数据,这些数据在第一个变量记录上显示了一些不需要的字符。因此,如果第一个变量=“RH”,我的逻辑不工作,我想提取第二个变量。谢谢。 – user2550880

2

您需要启用delayed expansion

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

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

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

因为没有答案的RH“”“为什么我符合∩╗┐开始”,我会做一些gravedigging。

所以,∩╗┐来自BOM(字节顺序标记),它表明文件是UTF格式的,以及如果需要写入字节的方式。 的答案: 可以使用

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

这将检查是否RH是在%_var1%(如果在var更换RH后,这是不变的,RH是不是在var) 这意味着, Bom是否在这里并不重要。尽管如果你想要一个精确的匹配,你会遇到问题。

处理它的另一种方法是不在文件中包含bom,这意味着要么保存为ASCII或UTF-8而没有BOM;或者使用工具从你的UTF-8文件中删除bom。

相关问题