2

フラット ファイルのすべての行を特定の文字数に変換するバッチ ファイルを作成したいと考えています (すべての行の末尾にスペースを追加します)。

例: 「text.txt」というテキスト ファイルがあり、次のようになります。

1
22
333
4444
55555

バッチ ファイルを実行して、次のメッセージを受け取りたいと思います (すべての行の長さは 7 文字です)。

1......
22.....
333....
4444...
55555..

(スペースをドットに置き換えて表示する必要がありました)

これは可能ですか?


アップデート:

クール、それは完璧に機能します。

空白行 (CRLF のみ) を 7 つのスペースに変換することもできますか? 空の行を含むファイルで上記を実行すると、それらは削除されます。

ありがとう!

編集:明確にするために、これはファイルです:

1
22

333
22

1
4444
55555

そして、私は受け取りたい:

1......
22.....
.......
333....
22.....
.......
1......
4444...
55555..

再度、感謝します!


更新 2:

Andriysの答えは、私を数歩前進させています。しかし、いくつかの問題があります。# サインアウトを残すと、出力は次のようになります (スペースではなくピリオドのまま):

1.......
22......
ECHO is off.
333.....
22......
ECHO is off.
1.......
4444....
55555...

行がスペースで始まる場合、次のように出力されます。

ECHO is off.

残念ながらPowershellはオプションではありません...

これはより良い例かもしれません、
text.txt:

This is
 the input
file 
     I

 want to convert

もちろん、レコードをもっと長くする必要があります。たとえば、20 文字としましょう。

4

2 に答える 2

3

これが1つの方法です(「SET strTemp = %1」のスペースの最後にピリオドを残しました。可視性のために、削除できます:

@ECHO OFF

FOR /F %%a IN (text.txt) DO Call :FixString %%a
PAUSE
EXIT

:FixString
 SET strTemp=%1       .
 ECHO.%strTemp:~0,7% >> output.txt
 EXIT /b

/編集:

Powershell はオプションですか? 次のように、そこでキャリッジ リターンを処理する方が簡単です。

Foreach ($strLine in Get-Content c:\temp\text.txt) 
{ 
 $strTemp = $strLine + "........"
 If ($strTemp.Length -lt 1) {
  Add-Content c:\temp\output.txt $strTemp
 } Else {
  Add-Content c:\temp\output.txt $strTemp.SubString(0,7)
 }
}

この Powershell スクリプトは、各行内にスペースがある場合にも動作します。以前に提供した .cmd スクリプトでは問題が発生します (それらを処理するには、For コマンドの delims= パラメーターを変更する必要があります)。

于 2011-07-08T21:28:19.277 に答える
2

ループはFOR空行を省略します。これは仕様によるものです。これを回避するには、次のコマンドを使用できます。

FIND /N /V "" < sourcefile

どの行も一致しない""(空の文字列) と見なされるため、単純FIND "" < fileに空の出力が生成されます。ただし、この/Vオプションは出力の反転を引き起こします。検索文字列に一致する行の代わりに、一致しないFIND行を出力します。したがって、本質的に のすべての行を出力します。次のように、すべての行の先頭に行番号が追加されます。FIND /V "" < fileFINDfile/N

[number]text
[number]text

したがって、空の行は次のようになります。

[number]
[number]
…

これで、すべての行を反復処理できるようになりました。すべての部分を削除する必要があるだけで、スペースを追加して最初の 7 文字を切り取るという @Dave のアイデアを使用します。完全なスクリプトは次のとおりです。[number]

@ECHO OFF
FOR /F "delims=" %%L IN ('FIND /N /V "" ^<text.txt') DO CALL :process "%%L"
GOTO :EOF

:process
SET "line=%~1"
SET "line=%line:*]=%       "
ECHO(%line:~0,7%#

(#文字は視覚的な表示のためにのみ追加されます。)

アップデート

(の直後に追加ECHO。これでECHO is off問題は解決します。(基本的に、 、 like .、などの代わりに、さまざまな文字を使用でき,ます。しかし、この回答に示されているように、(最も信頼できるようです。

更新 2

テキスト内のスペースを考慮して、ループ後に"delims="オプションを追加しました。FOR/F

于 2011-07-09T18:04:25.490 に答える