0

ファイル内の重複行を除外し、結果をセミコロンで区切られた変数 (「配列」のようなもの) に保存するスクリプトの作成に成功しました。私はそれに対する本当の良い解決策を見つけることができませんでした。

@echo off
setlocal enabledelayedexpansion

rem test.txt contains:
rem 2007-01-01
rem 2007-01-01
rem 2007-01-01
rem 2008-12-12
rem 2007-01-01
rem 2009-06-06
rem ... and so on

set file=test.txt

for /f "Tokens=* Delims=" %%i in ('type %file%') do (
    set read=%%i
    set read-array=!read-array!;!read!
)

rem removes first trailing ";"
set read-array=!read-array:*;=!
echo !read-array!

for /f "Tokens=* Delims=" %%i in ('type %file%') do (
    set dupe=0
    rem searches array for the current read line (%%i) and if it does exist, it deletes ALL occurences of it
    echo !read-array! | find /i "%%i" >nul && set dupe=1
    if ["!dupe!"] EQU ["1"] (
        set read-array=!read-array:%%i;=!
        set read-array=!read-array:;%%i=!
    )
    rem searches array for the current read line (%%i) and if it does not exist, it adds it once
    echo !read-array! | find /i "%%i" >nul || set read-array=!read-array!;%%i
)

rem results: no duplicates
echo !read-array!

の内容!read-array!2008-12-12;2007-01-01;2009-06-06

ここで、配列内の各項目を取り出して新しいファイルに書き込み、各項目の後に改行を入れたいと考えています。例:

2008-12-12
2007-01-01
2009-06-06

これが私がこれまでに思いついたものです。

私が抱えている問題は、ネストされているときに、2 番目の-loop が変数をトークン定義としてfor受け入れないことです。ただし、ネストされていない場合!loop!は受け入れます。%loop%このようにしている理由は!read-array!、アイテムの数が不明な場合があるため、それらもカウントします。何か案は?

rem count items in array
set c=0
for %%i in (!read-array!) do set /a c+=1

echo %c% items in array
for /l %%j in (1,1,%c%) do (
    set loop=%%j
    for /f "Tokens=!loop! Delims=;" %%i in ("!read-array!") do (
        echo %%i
        rem echo %%i>>%file%
    )
)
exit /b
4

1 に答える 1

2

最初のセクションの最後で、の内容が!read-array!is2008-12-12;2007-01-01;2009-06-06の場合、「リスト」の要素を単純なもので直接区切ることができます。forこれは、バッチ ファイルの標準の区切り記号が、スペース、コンマ、セミコロン、または等号のほかにある可能性があるためです。

for %%i in (%read-array%) do echo %%i

しかし、もっと簡単な方法を提案してもよろしいですか?

行の添え字値で「実際の」配列を定義しないのはなぜですか? このようにして、複数の行が繰り返され、その値が同じ配列要素に格納されます。最後に、結果の要素の値を表示するだけです:

@echo off
set file=test.txt
for /F "Delims=" %%i in (%file%) do (
    set read-array[%%i]=%%i
)
rem del %file%
for /F "Tokens=2 Delims==" %%i in ('set read-array[') do (
    echo %%i
    rem echo %%i>>%file%
)

編集 代替ソリューション

あなたが提案したように、セミコロンで区切られた値のリストを組み立てる別の方法があります。この場合、各値は最初に前のリスト コンテンツから削除され、すぐに再度挿入されるため、サイクルの最後に各値は 1 回だけ存在します。

@echo off
setlocal EnableDelayedExpansion
set file=test.txt
for /F "Delims=" %%i in (%file%) do (
    set read-array=!read-array:;%%i=!;%%i
)
rem del %file%
for %%i in (%read-array%) do (
    echo %%i
    rem echo %%i>> %file%
)
于 2011-11-15T21:33:17.133 に答える