web-dev-qa-db-fra.com

Lecture d'un fichier csv et extraction de certaines colonnes de données en fonction de la valeur de la première colonne

Il s’agit de mon premier programme batch et j’ai effectué des recherches en ligne, mais j’ai toujours du mal à écrire une solution.

J'ai le fichier CSV suivant:

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

J'essaye d'écrire un programme simple pour faire ce qui suit:

  • Si column1 = "RH", extrayez la valeur de column2 (2013/06/15 02:14:58 -0400)
  • Si column1 = "SH", extrayez la valeur column4 (LQ3SUEEWPWKL6)

et dirigez la sortie vers un fichier.


Ceci est mon code jusqu'à présent mais la condition si ne fonctionne pas pour moi

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

)

Mon fichier CSV a l'air bien dans Excel et le Bloc-notes, mais lorsque j'exécute le script pour afficher la première variable, il semble y avoir des caractères parasites juste avant le "RH" du premier enregistrement. Je ne peux pas le contourner, car je dois extraire une colonne supplémentaire. data si var1 = "RH":

"RH"
FH
01
SH
CH
TransactionID,PaymentTrackingID,
SF
SF
SC
RF
CAD,CR,0
RF
USD,CR,0
RC
FF
10
user2550880
(
FOR /F "tokens=1-18* delims=," %%A IN (%_InputFile%) DO (
  if "%%~A"=="RH" echo %%~B
  if "%%~A"=="SH" echo %%~D
 )
)>youroutputfilename

Devrait fonctionner - pas besoin d'attribuer toutes les valeurs à différentes variables - MAIS si vous prévoyez de les utiliser, alors

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

Notez qu'avec cette méthode, puisque vous attribuez %%x à _varx, si %%x est cité, les guillemets seront INCLUS dans la valeur attribuée. Pour supprimer les guillemets (s'ils existent), utilisez SET _varx=%%~x.


Addendum 20130703-1956Z pour le problème de l'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
Magoo

Vous avez un problème d'analyse. Tout d’abord, terminez la boucle for avec ), after this, vous pouvez utiliser les nouvelles variables:

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

Vous devez activer expansion retardée :

@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!
)
3
Ansgar Wiechers

comme il n'y avait pas de réponse à la question "Pourquoi ma ligne commence-t-elle par" RH "", je vais faire un peu de fossé.

Donc, le provient de la BOM (Byte Order Mark) qui indique que le fichier est en UTF et de la manière dont les octets sont écrits, si nécessaire. pour la réponse: vous pouvez utiliser

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

cela vérifiera si RH est dans% _var1% (si après avoir remplacé RH dans la variable, il est inchangé, RH ne l’est pas dans la variable). Cependant, vous aurez des problèmes si vous voulez une correspondance exacte.

une autre façon de régler le problème consiste à ne pas inclure le nom de domaine dans votre fichier, ce qui signifie que vous devez enregistrer soit dans ASCII, soit dans UTF-8 sans nomenclature; Ou utilisez un outil pour extraire le nom de votre fichier UTF-8.

1
satibel