0

次のコマンドを使用して、名前に基づいてファイルのリストを生成しています...

dir [folder_location] /b >[output_file_name.txt]

各グループの合計サイズが類似するように、それらを「n」個のグループにグループ化するにはどうすればよいですか?

[更新]例: 再編集のために 100 人に渡さなければならない 1000 個のファイルがあります。それぞれが編集するテキストの量がほぼ同じになるようにします。多すぎても不運になる人はおらず、少なすぎても幸運な人はいません。

4

2 に答える 2

0

ファイルをサイズ範囲でグループ化する最初の試み
(これは OP が望んでいたものではないことが判明しました)

ここに1つの方法があります。必要に応じてグループ定義を調整できます。グループ制限が降順でリストされていることが重要であり、最後のグループは 0 でなければなりません。

@echo off
setlocal
set "folder=test"
set "out=fileGroups.txt"
(
  pushd "%folder%"
  for /f "eol=: delims=" %%F in ('dir /b /a-d /os "*"') do (
    set "class="
    for %%A in (
      "100000  [>= 100,000]      "
      "10000   [10,000 - 99,999] "
      "1000    [1,000 - 9,999]   "
      "100     [100 - 999]       "
      "0       [< 100]           "
    ) do for /f "tokens=1*" %%B in (%%A) do (
      if not defined class if %%~zF geq %%B (
        echo %%C %%~nxF
        set class=1
      )
    )
  )
  popd
)>"%out%"
type "%out%"


ファイルをほぼ等しい合計ファイル長の n グループに分割する 2 回目の試行
(これは OP が求めているものです)

行番号でモジュロ (剰余) 演算子を使用して、すべてのファイルをグループに割り当てるのは簡単です。ファイルは単純にサイズで並べ替えることができますが、最初のグループは常にnのグループの中で最小のファイルを取得し、最後のグループは最大のファイルを取得します。グループは公平ではありません。

ファイルサイズのランダムな分布があると仮定すると、 nの特定のグループについて、どのグループが最小および最大になるかをローテーションすることが求められます。解決策は、少し数学を使えば驚くほど簡単です。

次のコードは、1 ~ 25 の番号を 5 つの異なるグループのいずれかに割り当て、その番号をグループ ファイルに書き込みます。各グループの合計は 65 です。

@echo off
setlocal enableDelayedExpansion
del group*.txt
for /l %%N in (1 1 25) do (
  set /a "group=((%%N-1)+(%%N-1)/5)%%5+1"
  echo %%N >>group!group!.txt
)

最終的な答えは、サイズでソートされたファイルのリストに上記を適用するだけです。名前は FINDSTR を介してパイプ処理され、各ファイルに「行番号」が割り当てられます。リストはファイルサイズでソートされるため、「行番号」はファイルサイズと同じようにソートされます。

@echo off
setlocal disableDelayedExpansion
set "inFolder=test"
set "outFolder=groups"
set "groups=5"
pushd "%inFolder%"
2>nul del "%outFolder%\group*.txt"
for /f "tokens=1* delims=:" %%A in ('dir /b /a-d /os "*"^|findstr /n "^"') do (
  set "file=%%B"
  set /a "group=((%%A-1)+(%%A-1)/groups)%%groups+1"
  setlocal enableDelayedExpansion
  >>"!outFolder!\group!group!.txt" echo !file!
  endlocal
)
popd
于 2012-12-18T21:42:12.450 に答える
0

/o:sのオプションを確認してくださいdirfor /fファイルをグループ化するには、ループを使用して情報の解析を行い、 を使用してファイルのサイズ出力を確認し%%~zA、その時点で分離を作成する必要があります。

filepath = sizeこれは、ディレクトリを除外し、大きいものから小さいものへとソートして出力する例です。

for /f "usebackq delims=" %%A in (`dir /b /o:-s /a:-d`) do echo.%%~dpnA = %%~zA
于 2012-12-18T21:35:31.567 に答える