使用批量合并多个.csv文件时删除标头

我已经编写代码来将示例文件连接成单个文件,而不是每个文件的标题。

input文件:

文件1:

[ 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 

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

 @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 /ad /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 } 

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

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

 > "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 ) ) ) 

如果您需要CSV文件的特定排序顺序,则需要使用另一个for /F循环,而不是for解析dir /B命令的输出以执行该作业的循环标准。 以下示例采用两行标题,然后按从最旧到最新修改日期的顺序对文件进行排序:

 > "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" ( set "FLAG=" for %%F in ("C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv") do ( for /F "usebackq eol=| delims=" %%L in ("%%~F") do ( echo(%%L if defined FLAG goto :LEAVE set "FLAG=#" ) ) ) :LEAVE >> "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\Combined.csv" ( for /F "eol=| delims=" %%F in (' dir /B /A:-D /O:D /T:W "C:\Users\kartikeya.avasthi\Desktop\Batch_Scripts\ContractEligibility_*.csv" ') do ( for /F "usebackq skip=2 eol=| delims=" %%L in ("%%F") do ( echo(%%L ) ) ) 

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

  • 此问题是Windows批处理文件执行错误的确切副本
  • 在这个问题上有4个答案,其中之一是我的。
  • 在我的回答中,我要求您发布一小部分数据文件,但是您从未回复过。
  • 这是我的答案在这个问题的副本,我稍微修改它,以便插入问题的关键点: 标题包含两行

编辑 :我修改了相应的代码发布在注释中的规范:每个文件中有三行标题,但只有第三个必须包括在输出。

 @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 

正如你所看到的,输出是你想要的。

编辑 :我无法测试修改,因为张贴的输入文件不包含真实文件相同的数据…

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

如果你觉得安装awk是Unix / Linux最方便的程序之一,你的任务将变得非常简单。 它可以从这里用于Windows。

那么你可以使用:

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

为了解释这个命令,你需要知道NRNumber of the RecordNumber of the Record (即行号),它从第一个文件的第一个记录/行的一个开始,然后随着每个记录递增,所以它会少一些仅仅是第一个文件的前两个记录而已。 另一方面, FNR是相同File Number of RecordFile Number of Record ,但是当每个新文件被打开时它重置为1,因此对于每个文件的前两个记录它将小于2。

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

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

请注意,如果您要下载gawk ,则它将与此示例中的awk相同。