2013-07-04 26 views
7

Bu benim ilk parti programımdır ve çevrimiçi arama yapıyorum ama yine de bir çözüm yazmaya çalışıyor. Bir csv dosyasından okuma ve ilk sütun değerine bağlı olarak belirli veri sütunlarını ayıklama

Aşağıdaki CSV dosyası vardır: Yapmak için basit bir program yazmaya çalışıyorum

"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", 
...... 

aşağıdadır:

  • sütun1 = "RH", daha sonra sütun2 değerini ayıklarsanız (2013/06/15 02:14:58 -0400)
  • sütun1 = "SH", sonra column4 değeri (LQ3SUEEWPWKL6) ayıklarsanız

ve bir dosyaya boru çıkışı.


Bu benim kod şimdiye kadar ama eğer durum

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

) 

My CSV dosyası Excel ve Not Defteri'nde iyi görünüyor benim için çalışmıyor ama senaryoyu yürütmek görüntülenecek ilk kayıtta sadece "RH" önce bazı çöp karakterler var gibi ilk değişken, görünüşe - Ben ek sütun veri ayıklamak gerekir çünkü bunu etkisiz edemez var1 = "RH" eğer:

"RH" 
FH 
01 
SH 
CH 
TransactionID,PaymentTrackingID, 
SF 
SF 
SC 
RF 
CAD,CR,0 
RF 
USD,CR,0 
RC 
FF 
+1

Ne denediniz? Ne kadar aldın? – dnet

+0

Şimdiye kadar sahip olduğum şey ama "if" koşulu bana çalışmıyor. – user2550880

+0

Bunu mu demek istediniz? IF "% _var1%" == "RH" echo% _var2% '? Ben bir 'var2' göremiyorum (bir önceki '_' olmadan). – Rapnar

cevap

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

çalışması gerekir: Öncelikle bu yeni değişkenler kullanabilirsiniz sonra ) ile döngü, için sona ardından

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 

Not bu yöntemle, %%x alıntı olup olmadığını o zaman %%x_varx atadığınız beri, tırnak atanan değer DAHİL edilecektir. Ekteki tırnakları kaldırmak için (varsa) SET _varx=%%~x kullanın.


OP'ın sorunu için Zeyilname 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

Teşekkür ederim - İlk örnek kodunuzu en basit olanı olarak seçtim. İlk kaydın _var1 içinde çöp karakterleri var, nasıl çıkacağını çünkü var2 – user2550880

+0

yazmıyor çünkü söz konusu kaydı görmeden ve çöp karakterlerinin ne olduğuna dair herhangi bir fikre sahip olmadan, ben bir kayıp yapıyorum. Eğer bir başlık kaydıysa, 'FOR/F' direktiflerinde' skip = 1' dahil olmak üzere, bu satırı dikkate almamak gerekir. Ayrıca bir 'setlocal' çalıştırmamış olduğunuzdan, önceki bir çalışmadan eski değerler ile uğraştığınızı unutmayın - ** IF ** '_var1' kullanıyorsunuz - ama kafam karışmışsa - eğer ilk kullanıyorsanız Örneğin, her durumda '_varx' ayarını engelleyen, neden _var1 'değeri anlamlı olmalı? Yoksa veri dosyanızdaki ilk satırın ilk elemanındaki değere mi atıf yapıyorsunuz? – Magoo

+0

İlk değişken kaydında bazı istenmeyen karakterler gösteren bazı örnek veriler ekledim. Sonuç olarak mantığım, ikinci değişkeni ilk değişken = "RH" ise çıkarmak istediğim yerde çalışmıyor. Teşekkür ederim. – user2550880

2

Sen delayed expansion etkinleştirmeniz gerekir:

@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

Bir ayrıştırma sorunu var. Bunları kullanmayı planlıyorsanız AMA - Farklı değişkenlere tüm değerleri atamak için gerek -

@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 "" "Benim çizgi ile ∩╗┐ başlar niçin", bazı gravedigging yapacağım hiçbir cevap gelmedi olarak.

Bu nedenle, file, dosyanın UTF'de olduğunu ve gerektiğinde baytların yazılma şeklini gösteren BOM (Bayt Sırası İşareti) öğesinden gelir.cevabını : RH _var1%% olarak ise

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

bu (var içinde RH değiştirdikten sonra, bunlar değişmeden ise, RH var içinde değildir) demek kontrol edecektir kullanabilirsiniz, Bom'un burada olup olmadığı önemli değil. Yine de, tam bir eşleşme istiyorsanız sorunlarınız olacaktır.

o tasarruf demektir ki dosyasında bom içermez etmektir başa başka bir yolu ya BOM olmadan ASCII veya UTF-8; Ya da bombayı UTF-8 dosyanızdan çıkarmak için bir araç kullanın.

İlgili konular