web-dev-qa-db-de.com

Lesen aus einer CSV-Datei und Extrahieren bestimmter Datenspalten basierend auf dem ersten Spaltenwert

Dies ist mein erstes Batch-Programm, und ich habe online gesucht, habe aber immer noch Schwierigkeiten, eine Lösung zu schreiben.

Ich habe die folgende CSV-Datei:

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

Ich versuche, ein einfaches Programm zu schreiben, mit dem Sie Folgendes tun können:

  • Wenn Spalte1 = "RH", dann extrahieren Sie den Wert für Spalte2 (15.06.2013 02:14:58 -0400).
  • Wenn column1 = "SH" ist, extrahieren Sie den Wert von column4 (LQ3SUEEWPWKL6).

und Pipe-Ausgabe in eine Datei.


Dies ist mein Code bisher, aber die if-Bedingung funktioniert für mich nicht

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

)

Meine CSV-Datei sieht in Excel und Notepad gut aus, aber wenn ich das Skript zur Anzeige der ersten Variablen ausführte, sieht es so aus, als ob vor dem "RH" des ersten Datensatzes einige Zeichen stehen Daten wenn 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

Sollte funktionieren - Sie müssen nicht alle Werte verschiedenen Variablen zuweisen - ABER, wenn Sie sie verwenden möchten

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

Beachten Sie, dass bei dieser Methode %%x_varx zugewiesen wird. Wenn %%x in Anführungszeichen steht, werden die Anführungszeichen in dem zugewiesenen Wert INCLUDED enthalten. Um die einschließenden Anführungszeichen zu entfernen (falls vorhanden), verwenden Sie SET _varx=%%~x.


Nachtrag 20130703-1956Z für das Problem von 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

Sie haben ein Analyseproblem. Beenden Sie zuerst die for-Schleife mit ), after hier können Sie die neuen Variablen verwenden:

@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

Sie müssen verzögerte Erweiterung aktivieren :

@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

da es keine Antwort auf die Frage gab, warum meine Linie mit ∩╗┐ "RH" beginnt, mache ich ein paar Totengräber.

Das ∩╗┐ stammt also von der BOM (Byte Order Mark), was darauf hinweist, dass die Datei in UTF vorliegt und wie die Bytes bei Bedarf geschrieben werden. Für die Antwort: können Sie verwenden

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

dadurch wird geprüft, ob sich die relative Feuchte in% _var1% befindet (wenn RH in der Variable nicht geändert wird, die RH nicht in der Variablen.). Dies bedeutet, dass die Bom nicht hier ist oder nicht. Allerdings haben Sie Probleme, wenn Sie eine genaue Übereinstimmung wünschen.

eine andere Möglichkeit, damit umzugehen, besteht darin, das bom nicht in Ihre Datei aufzunehmen. Dies bedeutet, dass Sie entweder in ASCII oder UTF-8 ohne Stückliste speichern. Oder verwenden Sie ein Werkzeug, um die Bombe aus Ihrer UTF-8-Datei zu entfernen.

1
satibel