【问题标题】:Merge CSV Files (Without Duplicates) in Batch批量合并 CSV 文件(不重复)
【发布时间】:2015-05-21 04:22:15
【问题描述】:

我想使用批处理合并两个相似的 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

(请注意,第四列未填写 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") 周围加上引号来使其正常工作,但无济于事。

【问题讨论】:

  • %1%2 是什么意思?请edit您的问题并提供呼叫线路示例,例如myscript.bat "File 1" "File 2"myscript.bat "c:\myfiles\File 1" "c:\myfiles\File 2"myscript.bat File1 File2 等...
  • 根据 ExpertsExchange 问题,%1 看起来应该*.csv,这可以解释for 循环。它还可以解释为什么脚本中没有 %2,因为你不应该像 script.bat file1.csv file2.csv file2.csv 那样称呼它。
  • 抱歉,我已经编辑过了。命令行是 merge.bat "directory*.csv"
  • 抱歉,我只能访问 Experts-Exchange... 所以,我没有费心点击它,还没有。 Mazy 由 OP 引用 %2。 @SomethingDark

标签: csv batch-file windows-7 merge command-prompt


【解决方案1】:

你可以试试这个

@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

如果您的数据中有=@,则它不起作用。

【讨论】:

  • 做到了!即使“%1”交换为 file1.csv,“%2”交换为 file2.csv。我希望这个批处理文件不会像另一个那样损坏!
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2020-09-23
  • 2019-10-30
  • 2012-01-14
  • 2020-05-08
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多