0

我正在尝试将几个具有相同字段的大型 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 时,我无法直接通过整个文件运行更多内容 - 任何人都可以帮忙吗?

4

3 回答 3

5
@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

于 2013-03-05T23:47:31.510 回答
1

这是一种不同的方法:

  1. 使用 copy 将所有文件连接到一个临时文件中,这既好又快。
  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
于 2013-03-06T01:47:51.243 回答
0

Simple solution:

After cd'ing into the directory that has the .csvs:

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

Here I have assumed that every csv has 4 header lines, but you can substitute with whatever number you want.

于 2014-08-08T17:56:47.743 回答