批量组合CSV删除标题

时间:2013-03-05 23:18:37

标签: csv batch-file dos

我正在尝试将几个大型csv文件与相同的字段组合在一起。我能做的最好的是:

@echo off
setlocal
set first=1
for %%F in (*.csv) do (
  if defined first (
    type "%%F" >> new.csv
    set "first="
  ) else (
    more +1 "%%F" >> new.csv
  )
) 

这适用于小文件,但是当文件较大时,更多命令会在每个屏幕转储结束时卡住。

尽我所能,在将其写入new.csv时,我无法获得更多直接浏览整个文件 - 任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

@ECHO OFF
SET first=y
SET newfile=new.csv
for %%F in (*.csv) do IF NOT %%F==%newfile% (
  if defined first (
    COPY /y "%%F" %newfile% >nul
    set "first="
  ) else (
    FOR /f "skip=1delims=" %%i IN (%%F) DO >> %newfile% ECHO %%i
  )
) 

修改
要支持CSV中的空白行,您可以将内部FOR替换为:
    for /f "skip=1 tokens=1* delims=:" %%i in ('findstr /n "^" %%F') do >> %newfile% echo.%%j

答案 1 :(得分:0)

这是一种不同的方法:

  1. 将使用copy的所有文件连接起来,这很好又快 临时文件。
  2. 阅读标题行。
  3. 将标题写入输出文件。
  4. 将与标题不匹配的任何行写入输出文件。
  5. 删除临时文件。
  6. 必须复制文件两次才有成本,但解析是使用应该快速运行的简单函数。

    @echo off
    setlocal
    set output=new.csv
    set temp=temp.csv
    copy *.csv %temp%
    set /p header=<%temp%
    echo %header%>%output%
    findstr /v /C:"%header%" %temp%>>%output%
    del %temp%
    endlocal
    goto :eof
    

答案 2 :(得分:0)

简单的解决方案:

进入具有.csvs:

的目录后

awk'FNR&lt; = 4&amp;&amp; NR&gt; 4 {next;} {print}'find . -type f -name '*.csv'&gt; combined.csv

这里我假设每个csv都有4个标题行,但你可以用你想要的任何数字代替。