出力を使用して同じフォルダー内のファイルに*.csv
リダイレクトすることに問題があるようです。DOS が原因でファイル.csv
を見つけているようで、それ自体に入力しています...コマンドが終了するまで別の出力ファイル名拡張子を使用できます。その後、出力ファイルの名前を変更できます...次のようなもの:my-new-file.csv
*.csv
type
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
。宣言した変数はすべて削除され、拡張機能は以前の値に戻されます。