我正在使用以下命令根据名称生成文件列表...
dir [folder_location] /b >[output_file_name.txt]
如何将它们分组为“n”组,以使每个组的总大小相似......?
[更新]例如:有 1000 个文件我必须给 100 个人重新编辑。我希望他们每个人都能获得大约相同数量的文本进行编辑。这样,没有人倒霉的太多,而另一个幸运的人太少。
第一次尝试按大小范围对文件进行分组
(事实证明这不是 OP 想要的)
这是一种方法。您可以根据需要调整组定义。重要的是,组限制按数字降序排列,最后一组必须为 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 组
(这是 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