出力を使用して同じフォルダー内のファイルに*.csvリダイレクトすることに問題があるようです。DOS が原因でファイル.csvを見つけているようで、それ自体に入力しています...コマンドが終了するまで別の出力ファイル名拡張子を使用できます。その後、出力ファイルの名前を変更できます...次のようなもの:my-new-file.csv*.csvtype
cd "Desktop\[csv-files]"
type *.csv > my-new-file.txt
ren my-new-file.txt my-new-file.csv
出力ファイルの途中でファイル ヘッダーが表示されないように、最初のファイル以降の各ファイルのヘッダーをスキップすることもできます。次のことを試してください。
@echo off
setlocal ENABLEDELAYEDEXPANSION
set cnt=1
cd "Desktop\[csv-files]"
for %%i in (*.csv) do (
if !cnt!==1 (
for /f "delims=" %%j in ('type "%%i"') do echo %%j >> my-new-file.txt
) else (
for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> my-new-file.txt
)
set /a cnt+=1
)
endlocal
ren my-new-file.txt my-new-file.csv
説明:
以前は、変数が適切に評価されENABLEDELAYEDEXPANSIONていることを確認していました。cnt遅延展開が有効な場合、!の代わりに を使用して変数を区別します%。したがって、cnt変数を評価するには、!cnt!代わりにを使用します%cnt%。cnt展開を遅らせると、それが使用される瞬間まで値の評価を待つことになります。常にではありませんが、 を使用する%cnt%と、以前の反復の値と等しくなることがあります。遅延展開を有効にして を使用する!cnt!と、常に正しい現在の値が評価されます。
に設定cntすることで、処理される最初のファイル1に対して異なるコードを実行できます。.csvコードには最初のファイルのすべての行が含まれ.csvますが、後続のすべてのファイルの最初の行はスキップされ.csvます。
ネストされたforループを使用しました。外側は、現在のフォルダー内のすべてのファイルをfor循環します。.csv内側のforループはtype "%%i"コマンドを実行します。ここで、 はファイル%%iの名前です。.csvファイルの各行は として個別に処理さ%%jれ、コマンドに渡されecho %%jます。 echo通常%%j、コマンド プロンプト ウィンドウに値を出力します。>ただし、またはを使用して、出力をファイルにリダイレクトできます>>。>リダイレクタは、出力ファイルを新しい値で上書きします。>>リダイレクタは、新しい値を出力ファイルに追加します。各ファイルの各行、および各ファイルは個別に処理されるため、>>リダイレクターを使用して、すべてのコンテンツを 1 つのファイルにプッシュします。
コマンドを使用するfor /fと、出力は指定された区切り文字を使用して個々の部分に分割されます。デフォルトの区切り文字はスペースです。を含めなかった場合"delims="、テキストThis is funは次のように分割されます。
%%j = This
%%k = is
%%l = fun
.csvファイルの行全体を一度に処理したいと考えています。区切り文字をなし ( "delims=") に設定すると、 を使用して行全体を処理できます%%j。
forコマンドの動作に関する具体的なヘルプについてfor /?は、コマンド プロンプトで入力してください。
endlocal環境を使用された時点の状態に戻しますsetlocal。宣言した変数はすべて削除され、拡張機能は以前の値に戻されます。