使用批处理合并多个.csv文件时删除标题

时间:2016-03-31 06:32:22

标签: windows batch-file

我已编写代码将示例文件连接到单个文件中减去每个文件的标题。

输入文件:

File1中:

[ Row : Header ],,,,,,,,,
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14

文件2:

[ Row : Header ],,,,,,,,,
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43

预期输出:

[ Row : Header ],,,,,,,,,
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14

实际输出:

[ Row : Header ],,,,,,,,,
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14
[ Row : Header ],,,,,,,,,
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14

请在下面找到用于此操作的代码:

@echo off
break>Combined.csv
cls
setlocal enabledelayedexpansion

if exist C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv del C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv

dir /a-d /b C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv>C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\dirfiles.txt

cd C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\

for /f "tokens=*" %%A in (C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\dirfiles.txt) do (
    set /p header=<%%A
    if "!header!" neq "" (
        (echo(!header!)>Combined.csv
        goto :break_for
    )

)
:break_for

for /f "tokens=*" %%A in (C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\dirfiles.txt) do (
        more +1 %%A>>Combined.csv
   )

del dirfiles.txt
}

有人可以帮我解决这个问题。我是批处理脚本的新手,无法调试此问题。

3 个答案:

答案 0 :(得分:1)

有关这个问题的几点意见:

  • 此问题与Windows Batch file execution error
  • 完全相同
  • 在那个问题上有4个答案,其中一个是我的答案。
  • 在我的回答中,我要求您发布一小部分数据文件,但您从未回复过。
  • 这是我在稍微修改它后的答案副本,以便插入问题的关键点:标题包含两行

编辑:我根据评论中发布的规范修改了代码:每个文件中有三行标头,但只有第3个必须包含在输出中。

@echo off
setlocal enabledelayedexpansion

cls

REM cd C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\

set "header3="
(for %%A in (*.csv) do (

   if not defined header3 (
      (set /p "header1=" & set /p "header2=" & set /p "header3=") <%%A
      echo !header3!
   )

   more +3 %%A

)) > Combined.txt
  • 当这个程序运行上面的数据时,这是生成的Combined.txt文件:

[ Row : Header ],,,,,,,,,
ContractNum,ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy
00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14
00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,Administrator,2016-02-29 10:46:14,2016-02-29 10:46:14
00024067,15562,9942PRMI,1,2014-09-16,2016-12-31,gintgUser,gintgUser,2016-02-21 05:59:43,2016-02-21 05:59:43

如您所见,输出与您想要的相同。

编辑:我无法测试修改,因为发布的输入文件包含与真实文件相同的数据...

  • 您应该跟进您发布的问题,而不是发布与前一个问题完全相同的新问题。
  • 您应该更清楚地描述问题并发布示例数据。

答案 1 :(得分:0)

不需要包含CSV文件列表的临时文件,您可以使用其{{1}通过标准for循环和嵌套for /F循环读取和组合它们删除标题的选项(假设标题总是一行)。初始头可以从另一个skip / for循环结构中获取,该结构在第一次迭代时被破坏:

for /F

如果您需要CSV文件的特定排序顺序,则需要另一个> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" ( for %%F in ("C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv") do ( for /F "usebackq eol=| delims=" %%L in ("%%~F") do ( echo(%%L goto :LEAVE ) ) ) :LEAVE >> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" ( for %%F in ("C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv") do ( for /F "usebackq skip=1 eol=| delims=" %%L in ("%%~F") do ( echo(%%L ) ) ) 循环而不是标准for /F循环来解析for命令的输出来完成该工作。以下示例采用两行标题,然后将文件从最旧的修改日期排序到最新修改日期:

dir /B

答案 2 :(得分:0)

如果您想安装awk - Unix / Linux中最方便的程序之一 - 您的任务将变得非常简单。它可从here开始用于Windows。

然后你可以使用:

awk  'NR<3 || FNR>2'  *.csv

要解释该命令,您需要知道NRNumber of the Record(即行号),它从第一个文件的第一个记录/行开始,然后随之增加每条记录,只有第一个文件的前两个记录,它将小于3。另一方面,FNRFile Number of Record是相同的,但在每个新文件打开时它会重置为1,因此对于每个文件的前两个记录,它将小于2。

因此,总而言之,命令说... “如果它是所有输入文件的前两行之一,或者如果它超过任何文件的第2行,则打印任何行。 “

请注意,您可能需要在Windows上用双引号替换单引号。

请注意,如果您要下载gawk,则此示例与awk的工作方式相同。