2013-07-04 140 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。

相關問題