2013-03-05 74 views
0

我想將幾個大的csv文件與相同的字段組合。我已經能夠做的最好的是:批量組合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 - 任何人都可以幫忙嗎?

回答

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

+0

+1。如果csv有空行,你應該'echo %% i'而不是'echo %% i'。你不希望'ECHO關閉'出現在新文件中。 – azhrei 2013-03-05 23:57:50

+0

@azhrei - FOR/F跳過空行,所以它們不應該是個問題。 – dbenham 2013-03-06 00:29:42

+0

如果將'>>%newfile%'移動到ELSE塊的右括號後面,則代碼將更有效(更快) – dbenham 2013-03-06 00:34:02

0

這裏有一個不同的方法:

  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 
+0

這也適用 - 感謝您的幫助! – user2137815 2013-03-06 17:38:22

0

簡單的解決方案:

cd'ing成具有.csvs目錄後:

AWK 'FNR < = 4 & & NR> 4 {下次;} {打印}' find . -type f -name '*.csv'> combined.csv

這裏我假定每個csv都有4個標題行,但是您可以用任何想要的數字替換。