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
  )
) 

これは小さなファイルではうまく機能しますが、ファイルが大きい場合、各スクリーンダンプの最後でより多くのコマンドがスタックします。

とにかく試してみてください。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. コピーを使用してすべてのファイルを連結します。これは高速で、一時ファイルになります。
  2. ヘッダー行を読みます。
  3. ヘッダーを出力ファイルに書き込みます。
  4. ヘッダーと一致しない行を出力ファイルに書き込みます。
  5. 一時ファイルを削除します。

ファイルを2回コピーする必要がある場合はコストがかかりますが、解析では、実行が高速である必要がある単純な関数を使用しています。

@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

簡単な解決策:

.csvsがあるディレクトリにcdした後:

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

ここでは、すべてのcsvに4つのヘッダー行があると想定していますが、任意の数に置き換えることができます。

于 2014-08-08T17:56:47.743 に答える