首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用批处理合并多个.csv文件时删除头

在使用批处理合并多个.csv文件时删除头
EN

Stack Overflow用户
提问于 2016-03-31 06:32:21
回答 3查看 2.5K关注 0票数 1

我已经编写了代码,将示例文件连接到一个文件中,减去每个文件的头。

输入文件:

File1:

行:标题、ContractNum、ProgramNum、CustomerNum、TierNum、StartDate、EndDate、DateCreated、CreatedBy、DateUpdated、UpdatedBy CreatedBy管理员、管理员,2016-02-29 10:46:14 2016-02-29 10:46:14 00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,Administrator,管理员,2016-02-29 10:46:14 2016-02-29 10:46:14

文件2:

行:标题、ContractNum、ProgramNum、CustomerNum、TierNum、StartDate、EndDate、DateCreated、CreatedBy、DateUpdated、UpdatedBy DateUpdated gintgUser、gintgUser,2016-02-2105:59:43

预期输出:

行:标题、ContractNum、ProgramNum、CustomerNum、TierNum、StartDate、EndDate、DateCreated、CreatedBy、DateUpdated、UpdatedBy 00032116,21238,81790PRMI,3,2014-05-02,2017-09-30,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

实际输出:

行:标题、ContractNum、ProgramNum、CustomerNum、TierNum、StartDate、EndDate、DateCreated、CreatedBy、DateUpdated、UpdatedBy CreatedBy gintgUser、gintgUser,2016-02-2105:59:43,2016-02-21 05:59:43 00032116,21238,60304PRMI,3,2014-05-02,2017-09-30,管理员,管理员,2016-02-29 10:46:14 2016-29 10:46:14排:标题ProgramNum,CustomerNum,TierNum,StartDate,EndDate,DateCreated,CreatedBy,DateUpdated,UpdatedBy CreatedBy Administrator,Administrator,2016-02-29 10:46:14 2016-02-29 10:14

请查找用于此操作的以下代码:

代码语言:javascript
复制
@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
}

有人能帮我解决这个问题吗。我是一个新手批次脚本,不能调试这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-31 08:13:37

不需要包含CSV文件列表的临时文件,您可以通过标准的for循环和嵌套的for /F循环来读取和组合它们,使用它的skip选项来消除标头(假设头总是一行)。初始头可以从第一次迭代时中断的另一个for/for /F循环构造中提取:

代码语言:javascript
复制
> "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循环,而不是解析dir /B命令输出的标准for循环来完成该工作。下面的示例采用两行头,然后从最老到最新的修改日期对文件进行排序:

代码语言:javascript
复制
> "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
        )
    )
)
票数 0
EN

Stack Overflow用户

发布于 2016-03-31 17:42:16

关于这个问题,有几点意见:

  • 这个问题与Windows批处理文件执行错误完全相同
  • 在这个问题上有四个答案,其中一个是我的。
  • 在我的回答中,我要求你张贴一小部分你的数据文件,但你从来没有回复。
  • 这是我在这个问题上的答案的副本,我对它做了一些修改,以插入问题的关键点:标题包含两行。

编辑:我根据注释中的新规范修改了代码:每个文件中有三行标题,但是只有第三行必须包含在输出中。

代码语言:javascript
复制
@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文件:

代码语言:javascript
复制
[ 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
EN

Stack Overflow用户

发布于 2016-03-31 09:47:02

如果您想安装awk --这是Unix/Linux中最简单的程序之一--那么您的任务就会变得非常简单。它可以从这里提供给Windows。

然后你就可以用:

代码语言:javascript
复制
awk  'NR<3 || FNR>2'  *.csv

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

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

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

注意,如果要下载gawk,它将与本例中的awk一样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36325776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档