2013-07-04 1 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", 
...... 

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

  • Если column1 = "RH", а затем извлечь значение COLUMN2 (2013/06/15 02: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

Вы имеете в виду 'IF '% _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 к _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 
+0

Спасибо. Я выбрал ваш первый образец кода, поскольку он был самым простым. Первая запись содержит символы мусора в _var1, как избавиться от нее, потому что она не печатает var2 – user2550880

+0

Без фактического просмотра записи и без каких-либо представлений о том, что это за мусорные символы, я в недоумении. Если это запись заголовка, то включение 'skip = 1' в директивы' FOR/f' должно игнорировать эту строку. Обратите внимание также, что, поскольку вы не выполнили '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.

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

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

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

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

Смежные вопросы