返回列表 发帖
你们的代码太精炼了,我许多方面都没有看明白。
我以前写了一个切分文本的代码,很菜。代码很长,很繁琐,方法也简单,拿出来请各位高手改改。
但,我试过好多次,没有出错过。
:: 代码代号含义:
:: k=文本总行数
:: cut=切分的列数
:: x=k/c=每列的行数
:: r=remainder=余数行=k-cx
:: ak=总添加的行数=(cut*(x+1))-k
:: s=记录当前文件需要排列的行数=x或(x+1)
:: s2=少行列=s-ak
:: n=记录当前列输出到第几行
:: m=记录当前输出到第几个文件
@echo off
title 切分文本程序(三分法)
set file=a
set Cut=9
setlocal enabledelayedexpansion
for /f "delims=" %%a in (%file%.txt) do set/a k+=1
set /a x=%k%/%Cut%
set /a r=%k%-%Cut%*%x%
set /a ak=(%Cut%*(%x%+1))-%k%
set m=
set m=1
set n=
for /f "delims=" %%i in (%file%.txt) do (
set /a n+=1
if !r! leq 0 (
set /a s=%x%
if !n! leq !s! echo %%i>>%file%_!m!.txt
if !n! equ !s! set n=0 & set /a m+=1
) else (
set /a s=%x%+1
if !ak! lss !s! (
if !n! leq !s! echo %%i>>%file%_!m!.txt
if !n! equ !s! set n=0 & set /a m+=1
if !m! equ !cut! set /a s2=!s!-!ak!
if !n! equ !s2! for /l %%i in (1,1,%ak%) do echo.>>%file%_!cut!.txt
) else (
if !m! leq !r! (
if !n! leq !s! echo %%i>>%file%_!m!.txt
if !n! equ !s! set n=0 & set /a m+=1
) else (
if !m! gtr !r! if !n! leq !x! echo %%i>>%file%_!m!.txt
if !m! gtr !r! if !n! equ !x! echo.>>%file%_!m!.txt
if !n! equ !x! set n=0 & set /a m+=1
)
)
)
)
endlocal
goto:eofCOPY

TOP

回复 30# pan528
也许代码的算法有误
这样吧 你把44楼代码里  if !h! lss !l! set /a j=(n%%l)*h 这里的 LSS 改为GTR 看是否你要的
@echo off&setlocal enabledelayedexpansion
%1 %0 :|more /t32 >n.txt&exit
set L=9
set "file=test.txt"
for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
for /f "usebackq tokens=*" %%i in ("%file%") do set /a N+=1&set #!N!=%%i
set /a h=(n+l-1)/l
if !h! gtr !l! set /a j=(n%%l)*h
if !j! equ 0 set j=!n!
for /l %%i in (1 1 %n%) do (
    set /a "i=^!(~-%%i/j),m=(~-%%i-(^!i*j))%%(~-H+i)+1"
    for %%j in (!m!) do set "$%%j=!$%%j!%tab%!#%%i!"
)
for /l %%i in (1 1 %h%) do for /f "tokens=*" %%j in ("!$%%i!") do echo %%jCOPY
代码处理流程是这样的
当行大于列 或 行小于列时的输出是不一样的

TOP

回复 47# terse

34/9通过了,34/11又变成了9列,我想算法可能有缺陷或漏洞 ...

TOP

本帖最后由 terse 于 2013-6-8 14:10 编辑

有点给数字绕晕的感觉
只能再试着简化下 思路闭塞 总不能突破
@echo off&setlocal enabledelayedexpansion
%1 %0 :|more /t32 >n.txt&exit
set "file=test.txt"
for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
for /f "usebackq tokens=*" %%i in ("%file%") do set /a N+=1&set #!N!=%%i
set L=9
set /a "h=(n+l-1)/l,i=^!(~-l/h),j=^!i*(n%%l)*h+i*n"
for /l %%i in (1 1 !n!) do (
    set /a "i=^!(~-%%i/j),m=(~-%%i-(^!i*j))%%(~-h+i)+1"
    for %%j in (!m!) do set "$%%j=!$%%j!%tab%!#%%i!"
)
for /l %%i in (1 1 !h!) do for /f "tokens=*" %%j in ("!$%%i!") do echo %%jCOPY
既然MORE 最后回车肯定有 没必要再处理它了吧
@echo off&setlocal enabledelayedexpansion
%1 %0 :|more /t32 >n.txt&exit
set "file=test.txt"
for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
for /f "usebackq tokens=*" %%i in ("%file%") do set /a N+=1&set #!N!=%%i
set L=9
set /a "h=(n+l-1)/l,j=n%%l,i=^!(l/h)"
if !j! equ 0 (set j=!n!)else set /a "j=~-l*h*i+j*h"
for /l %%i in (1 1 !n!) do (
    set /a "i=^!(~-%%i/j),m=(~-%%i-(^!i*j))%%(~-h+i)+1"
    for %%j in (!m!) do set "$%%j=!$%%j!%tab%!#%%i!"
)
for /l %%i in (1 1 !h!) do for /f "tokens=*" %%j in ("!$%%i!") do echo %%jCOPY

TOP

回复 49# terse
34/11,34/9都通过了,但是仍二分法,不是三分法:

二分法:
1       5       9       13      17      21      25      29      32
2       6       10      14      18      22      26      30      33
3       7       11      15      19      23      27      31      34
4       8       12      16      20      24      28

三分法:(余数小于每列的行数时,空行全部放在最后一列)
1       5       9       13      17      21      25      29      33
2       6       10      14      18      22      26      30      34
3       7       11      15      19      23      27      31
4       8       12      16      20      24      28      32

TOP

本帖最后由 terse 于 2013-6-9 23:36 编辑

不是列大于行 3分吗
余数: 34/9 应该余7  7大于行4啊
这里的余数是否 应该  34/4 余 2 ?

你30楼的描述
..三分法就是:在上面二分法的基础上,对切分列数小于每列行数的情形,用另一种方法排列,即把所有空格放在最后一列。...

TOP

返回列表