Создайте файл .bat на основе общего столбца, а выходной будет выборочный столбец - PullRequest
0 голосов
/ 16 апреля 2020

Я совершенно новичок в коде .bat. Я хочу объединить два файла CSV на основе общего столбца и выборочных столбцов для выходного файла. Например,

file1.csv

id,name,roll
1,x,12
2,y,13

file2.csv

id,class,subject
1,V,english
2,III,Math

Вывод будет

result.csv

id,name,class,subject
1,x,V,english
2,y,III,Math

Ниже приведен код, который я начал. Моя проблема в том, как использовать общий столбец и выбрать столбец.

@echo off

set "tmpfile=%temp%\result.tmp"
set "csvfile=result.csv"
copy nul "%tmpfile%" >nul

echo.
echo Processing all CSV files...
set "header="
for %%a in (%1) do (
    if not "%%a"=="%csvfile%" (
        set /p =Processing %%a...<nul
        for /f "tokens=1* usebackq delims=," %%b in ("%%a") do (
            if /i "%%b"=="Keyword" (
                if not defined header (
                    set /p =Found header...<nul
                    set "header=%%b,%%c"
                )
            ) else (
                title [%%a] - %%b,%%c
                findstr /b /c:"%%b" /i "%tmpfile%">nul || echo %%b,%%c>>"%tmpfile%"
            )
        )
        echo OK
    )
)
echo Finished processing all CSV files

echo.
echo Creating %csvfile%
echo %header%>"%csvfile%"

set /p =Sorting data...<nul
sort "%tmpfile%">>"%csvfile%"
echo OK
del "%tmpfile%"

echo Finished!
title Command Prompt
exit /b

1 Ответ

0 голосов
/ 16 апреля 2020

В описании проблемы не хватает нескольких деталей, и приведенный пример кода не имеет отношения к описанию. В описании вы говорите о двух файлах , но в коде вы обрабатываете «все файлы CVS» без указания того, какие «два файла» следует объединить. Код имеет неописанное значение «Ключевое слово». Код сортирует выходной файл, но в этом нет необходимости, потому что «оба входных файла отсортированы по общему столбцу», как вы сказали ...

В любом случае, я пытался помочь вам написать рабочий код, который достиг бы того, что вы сказали в описании проблемы. Я искал «объединение файлов» в теге Batch-file и получил несколько результатов, поэтому я просто использовал этот метод в качестве базового ...

@echo off
setlocal EnableDelayedExpansion

set "Header1="
set "Header2="
set "common2=-999999999"

rem Read second file from redirected input
< file2.csv (
   rem Read first file via FOR /F
   for /F "tokens=1,2 delims=," %%a in (file1.csv) do (
      if not defined Header1 (
         set "Header1=%%a,%%b"
      ) else (
         if !common2! lss %%a call :ReadNextFile2RecordUntil %%a
         if !common2! equ %%a echo %%a,%%b,!rest2!
      )
   )
) > result.csv
goto :EOF


:ReadNextFile2RecordUntil commonCol
set "line2="
set /P "line2="
if not defined line2 set "common2=999999999" & exit /B
for /F "tokens=1* delims=," %%A in ("%line2%") do (
   if not defined Header2 (
      set "Header2=%%B"
      echo %Header1%,%%B
      goto ReadNextFile2RecordUntil %1
   ) else (
      set "common2=%%A"
      set "rest2=%%B"
   )
)
if !common2! lss %1 goto ReadNextFile2RecordUntil %1
exit /B

file1:

id,name,roll
1,x,12
2,y,13
4,z,record1 with no matching record2
5,t,15

file2.csv:

id,class,subject
1,V,english
2,III,Math
3,IV,record2 with no matching record1
5,V,OK

result.csv:

id,name,class,subject
1,x,V,english
2,y,III,Math
5,t,V,OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...