【问题标题】:Batch combine large CSV files and remove repeating header批量合并大型 CSV 文件并删除重复标题
【发布时间】:2013-03-05 23:18:36
【问题描述】:

我正在尝试将几个具有相同字段的大型 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
  )
) 

这对小文件很有效,但是当文件较大时,more 命令会卡在每个屏幕转储的末尾。

尽我所能,在将文件写入 new.csv 时,我无法直接通过整个文件运行更多内容 - 有人可以帮忙吗?

【问题讨论】:

    标签: windows csv batch-file cmd


    【解决方案1】:
    @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。你应该 echo.%%i 而不是 echo %%i,以防 csv 有空行。您不希望 ECHO is off. 出现在新文件中。
    • @azhrei - FOR /F 跳过空行,所以它们永远不会成为问题。
    • 如果将 >> %newfile% 移到 ELSE 块的右括号之后,您的代码会更高效(更快)
    • @dbenham - 谢谢。我正在写一个答案并遇到了那个回声问题。不确定那里到底发生了什么。无论如何,CSV 可以有大量的空白行,因此跳过空白行是有问题的。
    • @dbenham for /f 绕过完全空行,但保留带有空格的行。 Echo 需要一些非空格。
    【解决方案2】:

    这是一种不同的方法:

    1. 使用副本将所有文件连接到一个 临时文件。
    2. 读取标题行。
    3. 将标头写入输出文件。
    4. 将任何与标题不匹配的行写入输出文件。
    5. 删除临时文件。

    必须将文件复制两次是有代价的,但解析使用的是应该快速运行的简单函数。

    @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
    

    【讨论】:

      【解决方案3】:

      简单的解决方案:

      在进入包含 .csvs 的目录后:

      awk 'FNR4{next;}{print}' find . -type f -name '*.csv' > combined.csv

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

      【讨论】:

        猜你喜欢
        • 2021-05-13
        • 2015-05-21
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多