批量合并 CSV 文件(不重复)
Merge CSV Files (Without Duplicates) in Batch
我想使用批处理合并两个相似的 CSV 文件。我找到了一个可以正常工作但现在不能正常工作的文件。这可能是因为重命名了使用的 CSV 文件。
我想要下面演示的内容:
文件 1:
name1,group1,data1
name2,group2,data2
name3,group3,data3
文件 2:
name1,group1,data1,time1
name2,group2,data2,time2
合并文件:
name1,group1,data1,time1
name2,group2,data2,time2
name3,group3,data3
(注意第4栏不是name3填写的,后来不在文件2上。)
以下代码修改自:http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/MS_DOS/Q_27694997.html.
@echo off
set "tmpfile=%temp%\importlist.tmp"
set "csvfile=importlist.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
问题是当执行时它只是创建一个排序的 CSV,其中包含第一个文件而不是第二个文件的所有数据。
我试图通过在参数 (%1 - "directory*.csv") 周围加上引号来让它工作,但没有成功。
你可以试试这个
@echo off &setlocal disabledelayedexpansion
for /f "delims=" %%a in (file1.csv) do set "@%%~a=7"
for /f "tokens=1-4delims=," %%a in (file2.csv) do (
set "lx1=@%%~a,%%~b,%%~c"
setlocal enabledelayedexpansion
if defined !lx1! (
endlocal
set "@%%~a,%%~b,%%~c="
) else (
endlocal
)
set "@%%~a,%%~b,%%~c,%%~d=4"
)
(for /f "delims==@" %%a in ('set @') do echo %%~a)>merge.csv
type merge.csv
如果您的数据中有 =
或 @
,则它不起作用。
我想使用批处理合并两个相似的 CSV 文件。我找到了一个可以正常工作但现在不能正常工作的文件。这可能是因为重命名了使用的 CSV 文件。
我想要下面演示的内容:
文件 1:
name1,group1,data1
name2,group2,data2
name3,group3,data3
文件 2:
name1,group1,data1,time1
name2,group2,data2,time2
合并文件:
name1,group1,data1,time1
name2,group2,data2,time2
name3,group3,data3
(注意第4栏不是name3填写的,后来不在文件2上。)
以下代码修改自:http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/MS_DOS/Q_27694997.html.
@echo off
set "tmpfile=%temp%\importlist.tmp"
set "csvfile=importlist.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
问题是当执行时它只是创建一个排序的 CSV,其中包含第一个文件而不是第二个文件的所有数据。
我试图通过在参数 (%1 - "directory*.csv") 周围加上引号来让它工作,但没有成功。
你可以试试这个
@echo off &setlocal disabledelayedexpansion
for /f "delims=" %%a in (file1.csv) do set "@%%~a=7"
for /f "tokens=1-4delims=," %%a in (file2.csv) do (
set "lx1=@%%~a,%%~b,%%~c"
setlocal enabledelayedexpansion
if defined !lx1! (
endlocal
set "@%%~a,%%~b,%%~c="
) else (
endlocal
)
set "@%%~a,%%~b,%%~c,%%~d=4"
)
(for /f "delims==@" %%a in ('set @') do echo %%~a)>merge.csv
type merge.csv
如果您的数据中有 =
或 @
,则它不起作用。