Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批量合并大型CSV文件并删除重复标题_Windows_Csv_Batch File_Cmd - Fatal编程技术网

Windows 批量合并大型CSV文件并删除重复标题

Windows 批量合并大型CSV文件并删除重复标题,windows,csv,batch-file,cmd,Windows,Csv,Batch File,Cmd,我正在尝试将几个具有相同字段的大型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命令会在每个屏

我正在尝试将几个具有相同字段的大型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时,我无法直接运行更多的内容-有人能帮忙吗

@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/f“skip=1 tokens=1*delims=:”%%i in('findstr/n^“%%f”)do>%newfile%echo.%%j

编辑
要支持CSV中的空行,可以将的内部替换为:

for/f“skip=1 tokens=1*delims=:“%%i in('findstr/n^“%%f”)do>%newfile%echo.%%j
这里有一种不同的方法:

  • 使用copy将所有文件连接到一个 临时文件
  • 阅读标题行
  • 将头写入输出文件
  • 将与标题不匹配的任何行写入输出文件
  • 删除临时文件
  • 必须复制两次文件是有代价的,但是解析使用的是简单的函数,这些函数应该可以快速运行

    @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
    
    @echo关闭
    setlocal
    设置输出=new.csv
    设置temp=temp.csv
    复制*.csv%temp%
    设置/p标题=%output%
    findstr/v/C:“%header%”%temp%>>%output%
    删除%temp%
    端部
    后藤:eof
    
    这里有一种不同的方法:

  • 使用copy将所有文件连接到一个 临时文件
  • 阅读标题行
  • 将头写入输出文件
  • 将与标题不匹配的任何行写入输出文件
  • 删除临时文件
  • 必须复制两次文件是有代价的,但是解析使用的是简单的函数,这些函数应该可以快速运行

    @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
    
    @echo关闭
    setlocal
    设置输出=new.csv
    设置temp=temp.csv
    复制*.csv%temp%
    设置/p标题=%output%
    findstr/v/C:“%header%”%temp%>>%output%
    删除%temp%
    端部
    后藤:eof
    
    简单解决方案:

    将光盘刻录到包含.csvs的目录后:

    awk'FNR4{next;}{print}{code>find-键入f-名称'*.csv'>combined.csv

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

    简单解决方案:

    将光盘刻录到包含.csvs的目录后:

    awk'FNR4{next;}{print}{code>find-键入f-名称'*.csv'>combined.csv


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

    +1。如果csv有空行,您应该
    echo.%%i
    ,而不仅仅是
    echo%%i
    。您不希望
    ECHO关闭。
    出现在新文件中。@azhrei-FOR/F跳过空行,因此它们永远不会成为问题。如果将
    >%newfile%
    移到ELSE的右括号后,您的代码将更高效(更快)block@dbenham-谢谢。我在写答案时遇到了回声问题。不确定那里到底发生了什么。无论如何,CSV可能有重要的空行,因此跳过空行是有问题的。@dbenham for/f完全绕过空行,但保留带空格的行。Echo需要一些非空格。+1。如果csv有空行,您应该
    echo.%%i
    ,而不仅仅是
    echo%%i
    。您不希望
    ECHO关闭。
    出现在新文件中。@azhrei-FOR/F跳过空行,因此它们永远不会成为问题。如果将
    >%newfile%
    移到ELSE的右括号后,您的代码将更高效(更快)block@dbenham-谢谢。我在写答案时遇到了回声问题。不确定那里到底发生了什么。无论如何,CSV可能有重要的空行,因此跳过空行是有问题的。@dbenham for/f完全绕过空行,但保留带空格的行。Echo需要一些非空格。