2017-06-04 9 views
2

ツリーディレクトリ構造で5000個のCSVファイルを設定しました。 すべてのファイルが最初の行でエンコーディングを示しています。その後、一般的なCSVコンテンツが続きます。ディレクトリサブツリーの各テキストファイルから最初の行を抽出します

UTF-8 
Key1,"Value 1", 
Key2,"Value 2" 
etc, etc... 

は、どのように私はすぐに彼らのエンコーディングのセットを監督するために、各ファイルの最初の行を収集することができますか?

私はthis answerの助けを借りてこれをしようとしているが、部品は、単一のファイルに対して(個別に実行されている場合は、私がEcho is on.

for /R D:\resources\ %%f in (*.csv) do (
    set /p line1=<%%f 
    echo %line1% >> out.txt 
) 

ようなものを取得していますので、私は明らかにバッチファイルの変数のすべての構文ニュアンスを理解していません)、 彼らが働きます。

私はまた、単一のライナー

for /R D:\resources\ %f in (*.csv) do set /p line1=<%f & echo %line1% >> out.txt 

が、各ファイルの出力に最初のファイルから収集したこの1つのプット値をしようとしていました。

+1

あなたが取得しているが、 'エコーon.'です'%line1%'は空に見えるからです。 *と同じコードブロックに変数を読み込んで[遅延拡張](http://ss64.com/nt/delayedexpansion.html)を有効にしてください。最後に 'echo'コマンドラインを' >> out.txt echo(!line1! '。 – aschipfl

+1

@aschipfl - 助けました。答えとして追加しますか?私はそれを受け入れますか? – miroxlav

答えて

2

ここでの主な問題は、あなたがを書く際に必要とされるdelayed expansionの欠如は、コードの同じブロック内の変数を読んで。それがなければ、ブロックを解析するときに存在する変数値を読み込んでいるので、より前にはが実行されます。ここでは、固定のコードは次のとおりです。

また
@echo off 
copy NUL out.txt 
setlocal EnableDelayedExpansion 
for /R "D:\resources" %%g in ("*.csv") do (
    set "line1=" 
    < "%%~g" set /P line1="" 
    >> "out.txt" echo(!line1! 
) 
endlocal 

、私は彼らにあるホワイトスペースや特殊文字とのトラブルを避けるために、すべてのファイル/ディレクトリパスを引用しました。また、echo(!line1! >> "out.txt"SPACE>>の前に出力するので、redirection syntaxを逆転しました。 SPACEの後ろにあるechoの代わりに(が表示されますが、!line1!の読み取り行が空の場合はECHO is {on|off}.が返されません。

ところで、あなたは単にあなたが括弧の周囲のペアを置くことを考えると、一度>を使用して出力ファイルに全体forループをリダイレクトすることができ、最初は空の出力ファイルout.txtを用意する必要はありません。


@echo off 
setlocal EnableDelayedExpansion 
> "out.txt" (
    for /R "D:\resources" %%g in (*.csv) do (
     set "line1=" 
     < "%%~g" set /P line1="" 
     echo(!line1! 
    ) 
) 
endlocal 
はシングルライナーとしてコマンドプロンプトで直接同じことを行うには、これを試してみてください。

cmd /V /C (for /R "D:\resources" %g in ("*.csv") do @(set "line1=" ^& ^< "%~g" set /P line1="" ^& echo(!line1!)) ^> "out.txt" 
+0

Man ...これは非常に資格のある答えです。これはまた、プロのトリックで詰め込まれたスクリプトファイルがレクリエーションスクリプト作成者のために読みにくくなる方法です:)このQ/Aをブックマークして、次回のテクニックに戻します。最適化とその説明をありがとう。 – miroxlav

0

aschipfl's comment助けました。他人の利益のために修正して完成したスクリプトを追加:

@echo off 
copy NUL out.txt 
SETLOCAL EnableDelayedExpansion 
for /R D:\resources\ %%g in (*.csv) do (
    set /p line1=<%%g 
    echo !line1! >> out.txt 
) 
関連する問題