it-swarm.com.ru

Чтение из 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", 
......

Я пытаюсь написать простую программу для следующего:

  • Если column1 = "RH", тогда извлеките значение column2 (2013/06/15 02:14:58 -0400)
  • Если column1 = "SH", то извлечь значение column4 (LQ3SUEEWPWKL6)

и конвейерный вывод в файл.


Это мой код, но условие if не работает для меня

@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 и Notepad, но когда я выполняю скрипт для отображения первой переменной, похоже, что есть некоторые символы мусора непосредственно перед «RH» в первой записи - я не могу обойти это, так как мне нужно извлечь дополнительный столбец данные, если 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

Должно работать - не нужно присваивать все значения различным переменным - НО, если вы планируете их использовать, то

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 для _varx, тогда, если %%x заключен в кавычки, кавычки будут включены в назначенное значение. Чтобы удалить заключающие в кавычки (если они существуют), используйте SET _varx=%%~x.


Приложение 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
10
Magoo

У вас есть проблема с разбором. Сначала завершите цикл for с помощью ), после это вы можете использовать новые переменные:

@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

Вам нужно включить отложенное расширение :

@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

так как не было ответа на вопрос «почему моя строка начинается с ∩╗┐« RH »», я сделаю несколько серьезных работ.

Таким образом, ∩╗┐ происходит из BOM (Byte Order Mark), которая указывает, что файл находится в UTF, и способ записи байтов, если это необходимо. для ответа: вы можете использовать

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

это проверит, находится ли RH в% _var1% (если после замены RH в var оно не изменяется, RH не в var) , что означает, что Bom здесь или нет, не важно. Тем не менее, у вас будут проблемы, если вы хотите точное совпадение.

другой способ справиться с этим - не включать бомбу в файл, что означает сохранение либо в ASCII, либо в UTF-8 без спецификации; Или используя инструмент, чтобы убрать бомбу из файла UTF-8.

1
satibel