0

組み合わせる必要のある.csvファイルがある場合があります。それらは同じヘッダーと列レイアウトを持っています。Windows 7でそれらを組み合わせる簡単な方法が必要です。ユーザーは、常にExcelがインストールされているとは限りません。

.cmdマクロは素晴らしいでしょうが、私がオンラインで見つけたものは機能しません。

私がこれまでに得た最高のものはこれです:

「コマンドウィンドウ(「cmd.exe」)を開き、次の2行を入力します(角かっこなし)

cd "Desktop\[csv-files]"
type *.csv > my-new-file.csv"

Where the files to be combined are in Desktop\[csv-files].

しかし、結合されたエントリの重複(または場合によっては3回)が作成されるようです。たとえば、23個と26個の一意のエントリをそれぞれ使用してテストした2つのファイルがあります。100エントリのファイルを取得し、少なくとも1つのエントリを3回繰り返しました。

現在、私がテストしている.csvファイルの長さはわずか25エントリですが、やがては数千以上になる可能性があります。

4

1 に答える 1

2

出力を使用して同じフォルダー内のファイルに*.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。宣言した変数はすべて削除され、拡張機能は以前の値に戻されます。

于 2013-02-04T22:28:50.343 に答える