2017-11-14 20 views
1

私はプログラミングの初心者です。delimコマンドはtxtファイルの部分のみを読み取る

私は、ディレクトリ内のファイルのリストを含むtxtファイルAを持っています。

シナリオ: 新しい行の特殊文字コードを削除し、txt fileAのjpgファイル名(cicra 10000)のリストからコンマで置き換えて出力ファイルBに出力します。

問題: ランダムな量のファイル名のみが出力ファイルに到達します。いくつかまたは多くが欠けている。

ここでのコードだ...

==================================== ====

dir /o /b > fileA.txt 
set "txt=" 
for /f "delims=" %%a in (fileA.txt) do (
    set "txt=!txt!%%a," 
) 
set "txt=!txt:~0,-1!" 
>fileB.txt echo !txt! 

======================================= ==

すべてのヘルプ感謝:) は

+1

'delim'コマンドはありません。' delims'オプションを使って、 '' for''(http://ss64.com/nt/for.html) '/ F'コマンドです。とにかく、文字列は約8190文字/バイトの長さに制限されています。 ';'で始まる文字列は 'for/F'によって無視されます。デフォルトの' eol'オプション... – aschipfl

+0

ありがとうaschipl1 - それは8kbの出力ファイルを説明します! –

+0

正しい方向に私を押してください。代わりに何をする必要があるのか​​な? –

答えて

0

をいただき、ありがとうございますないすべてのファイル名がに追加される理由を説明しているMicrosoftのサポート記事Command prompt (Cmd. exe) command-line string limitationを読みます環境変数txtは、そのような大きなファイル名のリストにあります。

回避策の1つは、ファイル名をテキストファイルに書き込んで、ツールを使用してすべての改行と改行をカンマで置き換えることです。ここで

デイブベンハムによって書かれ粘土ルースまたはjrepl.batによって書かれ
How can you find and replace text in a file using the Windows command-line environment?

@echo off 
rem Replace using very fast Xchang32.exe written by Clay Ruth. 
dir *.jpg *.jpeg /A-D /B /ON >ImageList1.txt 
"%~dp0Xchang32.exe" ImageList1.txt "^x0D^x0A" ",," >nul 

rem Replace using a bit slower jrepl.bat written by Dave Benham. 
dir *.jpg *.jpeg /A-D /B /ON >ImageList2.txt 
call "%~dp0jrepl.bat" "\r\n" "," /M /F ImageList2.txt /O - 

rem JREPL.BAT v7.7 leaves behind JREPL\XBYTES.HEX in folder for temporary files. 
rd /Q /S "%TEMP%\JREPL" 2>nul 

Xchang32.exe上の回答から、この回避策を使用して、2つのソリューションは、バッチファイルと同じディレクトリにある必要があります。

注1:DIRによる最後のライン出力はまた、キャリッジリターン+ラインフィードで終わるため
画像リストファイルの内容は、カンマで両方のソリューションを終了します。

私はまた、次のコマンドラインを試みた:

call "%~dp0jrepl.bat" "\r\n(?=.)" "," /M /F ImageList2.txt /O - 

Perlの正規表現検索文字列\r\n(?=.)では、文字列,が最後のキャリッジリターン+ラインフィードを交換しないでしょうPerlの正規表現をサポートしているテキストエディタで働いている置き換えます最後のCR + LFでは改行文字を除くすべての文字の肯定的な先読みは真ではないが、それはMicrosoftのJScript(少なくともWindows XPでは)を使用してjrepl.batで動作しないためです。

注2:あるため、この場合にDIR任意の名前のファイルを検索していると同じディレクトリにないイメージリストファイルを作成することをお勧めしますDIRコマンドラインで*.jpg *.jpegを使用しないで
リストファイルもリストに含まれます。

+0

ありがとうMofi 私はこのコマンド構造を試しましたが、これはうまくいくようですが、処理に時間がかかります(10分!)。一度に1行を出力するので、最大8 KBを強調しません。/fに対する output.txtと ブレーク> "delims =" %%中(JPGFileList.txt)を行う( セットTXT = %%、 セットTXT = TXT:!!〜0、-1 > output.txt ) これは、私がもう少しコーディングについて学ぶまではこれで終わりです。 :) もう一度ありがとう。 –

0

問題は、すべてのデータを1つの文字列で収集しているため、Windowsのコマンドプロンプトcmdで約8190文字/バイトの文字列にすばやく到達することです。

これを回避する1つの方法は、set/Pを使用することです。これは、表示メッセージを使用して変数の値をユーザーに入力することを目的としています。

  • > "fileB.txt" < nul (
        set "FLAG=#" 
        for /F "delims= eol=|" %%a in ('dir /O /B') do @(
         if defined FLAG (
          set /P ="%%a" 
          set "FLAG=" 
         ) else (
          set /P =",%%a" 
         ) 
        ) 
    ) 
    

    は、しかし、次の制限事項があります。

    > "fileA.txt" dir /O /B 
    > "fileB.txt" < nul (
        set "FLAG=#" 
        for /F "usebackq delims= eol=|" %%a in ("fileA.txt") do @(
         if defined FLAG (
          set /P ="%%a" 
          set "FLAG=" 
         ) else (
          set /P =",%%a" 
         ) 
        ) 
    ) 
    

    は実際にあなたが暫定ファイルfileA.txtは必要ありません:このメッセージは、任意の末尾の改行せずに出力されます単一項目は1021文字/バイトを超えてはいけません(これはset /Pの制限です)。

  • 先頭の空白(および後続のものも)が失われます。
  • 文字列は=記号で始まらなければなりません(場合によっては構文エラーが発生します)。
関連する問題