2012-05-15 8 views
5

iが含まれているfile.txtをというファイルがした変数環境に置きますか?複数行のテキストファイルには、どのよう

私はバッチファイルからこれを行うことができます。 TEST.BAT

set LF=^ 
    [blank line] 
    [blank line] 
    rem two blank lines needed above 
    set multi=Line 1!LF!Line 2!LF!Last line 
    echo !multi! 

これは3行出力:

 Line 1 
     Line 2 
     Last line 

ので、どのように私は、バッチファイル内ENVVARにfile.txtを得ることができますが?

+0

は^本当にファイルにカラットで、またはことがCRLFのプレースホルダですか?私はこれがWindowsマシンであると仮定しています。 – RobW

+0

キャレットは実際にファイル内にあります。これは、1つの改行文字を含む変数を作成する方法です。 'set LF = ^'の後ろに2つの空白行が続きます – jeb

+0

清算のためのjebに感謝します –

答えて

7

dbenham氏によると、/ fを使用しても可能ですが、もう少し複雑です。

シンプルな80%水溶液を

setlocal EnableDelayedExpansion 

set "var=" 
set LF=^ 


rem *** Two empty lines are required for the linefeed 
FOR /F "delims=" %%a in (myFile.txt) do (
    set "var=!var!!LF!%%a" 
) 
echo !var! 

ですが、それはで失敗します。
- 行が空白の場合、それは
スキップされます - 行が;で始まる場合EOL文字
- 行が!(およびキャレット)が含まれている場合

しかし、その後、あなたは

もう少し複雑なソリューションを使用することができます3210
@echo off 
SETLOCAL DisableDelayedExpansion 
set "all=" 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ aux1.txt"`) do (
    set "line=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "line=!line:#=#S!" 
    set "line=!line:*:=!" 
    for /F "delims=" %%p in ("!all!#L!line!") do (
     ENDLOCAL 
     set "all=%%p" 
    ) 
) 
SETLOCAL EnableDelayedExpansion 
if defined all (
set "all=!all:~2!" 
set ^"all=!all:#L=^ 

!" 
set "all=!all:#S=#!" 
) 
echo !all! 

コードは何をしますか?
まず、findstr /n ^^

1:My first Line 
2:; beginning with a semicolon 
3: 
4:there was an empty line 

のように、行番号とコロンとのそれぞれの行を付加しますこれは、空行の問題とも標準EOL文字;は無視することができますを解決します。
遅延の拡張を無効にしている間に、行の内容を取得するには値を変数に設定します。これにより、!^の問題が解決します。

行番号とコロンを削除するには、遅延拡張が有効になります(デリムは:で解決できません)。

#はすべて、#Sに置き換えられます。これは、プレフィックスを削除した後に行が空になり、置換が失敗する可能性があるため、最初に行われます。
しかし、なぜ私はそれを置き換えるのですか?
/Fについては、以下が埋め込まれた改行で失敗と同じように、私は、ここに改行を挿入することはできませんので、私は唯一の改行マーカー(このケースでは、私は#Lを使用)が、ファイルの内容を追加し、
です#Lも含めることができますが、すべて##Sに置き換えると、すべてのマーカーが一意です。

endlocalを使用して遅延拡張を閉じる/無効にするには問題がありますが、変更されたallline変数の内容は保持されます。
これは%%pendlocalバリアの背後にあるコンテンツを運ぶことができるので、FOR/F-endlocalトリックで行われます。

次に、完全なファイルを読み終えたら、空ファイルのために空であるので、allが定義されているかどうかをチェックします。
最初の改行マーカー#Lは削除され、他のすべてのマーカーは実際の改行文字に置き換えられます。
その後、シャープな安全な#S#に戻ります。

そうでも、この解決策は明らかにされ、すべての...

+0

+1、私はFOR/Fルートを下り始めましたが、その後私は自分自身に "なぜ私はこの仕事をしていますか? :-) – dbenham

+0

非常に面白い:)しかし、私はちょうどDOSのintracsiesを学びたい卑劣なメスとして来て...そしてあなたは古い大学を試してみると謙虚になります...しかし、あなたのすべて仕事、ここと海外!私は道にとどまる –

+0

もちろんこれは華麗です!私のソースファイル(aux)は実際にはSQLのレコードに挿入する必要のあるhtmlファイルです(そしてソースには最初の行に!が含まれています)。コードのその洞察力のビットのために+2!だから今私はちょうどそれが8kの制限の下にあることを確認するためにファイルのサイズをチェックしなければならない場合、私は分割することができます!すべて!に!all1! !all2 !,など。私のファイルの約半分は8k-30Kなので、おそらく最大値は4〜5です! varの。共有のおかげで –

2

あなたはほぼそこにいました。テキストの各行を読み、その行にラインフィードと改行を追加する必要があります。

FOR/Fを使用できますが、コンテンツに!文字が含まれていると遅延拡張でうまく再生されません。また、EOLオプションを無効にするには、空白行を残しておかなければなりません。

簡単な解決策は、SET/Pを使用して行を読み取ることです。この技術の制限は、次のとおり

1)ファイルがキャリッジリターン、改行のWindowsの標準ラインターミネータを使用しなければならない)、各ライン

2からの制御文字を末尾トリム。 Unixスタイルの改行では動作しません。

3)これは、環境変数は、データのみの弱8キロバイトを保持できることを念頭に置いて行終端文字を含まない行あたり1023バイト()

ベアを読みに限定されています。したがって、このテクニックを使用して、非常に小さいファイルを変数にロードすることに限定されています。

@echo off 
setlocal enableDelayedExpansion 
set LF=^ 


:: Two blank lines above needed for definition of LF - do not remove 
set file="test.txt" 
set "var=" 
for /f %%N in ('find /c /v "" ^<%file%') do set lineCnt=%%N 
<%file% (
    for /l %%N in (1 1 %lineCnt%) do (
    set "ln=" 
    set /p "ln=" 
    set "var=!var!!ln!!lf!" 
) 
) 
set var 
+0

Mr Benhamありがとう!私は今これに取り組んでいます。 –

+0

+1、それは最も簡単な方法で、ほとんどの場合、もっと必要としないので、 – jeb

+0

よく私は私のファイルが8kを超えることがあるので、私はこの制限を押し込むかもしれないと思うので、私は2つに1つのファイルを解析する必要があります私は不可能を試みるでしょう:) –

関連する問題