返回列表 发帖
原来这样  理解能力问题
@echo off&setlocal enabledelayedexpansion
set "Tab=        "这里改为跳格键
for /f "delims=" %%i in (_a.txt) do (
    set str=%%i&set n=
    for %%j in ("!str:%Tab%="%Tab%"!") do (
        set /a n+=1
        for %%k in (!n!) do set "l_%%k=!l_%%k!|%%~j"
    )
)
for /l %%i in (1 1 %n%) do (
    for %%j in ("!l_%%i:~1!") do (
        if defined _%%j (
           if defined -%%j (
              set "-%%j=!-%%j! %%i列"
           ) else set /a m+=1&set __!m!=%%j&set "-%%j=!_%%j! %%i列"
        ) else set _%%j=%%i
    )
)
for /l %%i in (1 1 %m%) do for %%j in (!__%%i!) do echo!-%%j!内容相同,列内容如下:&echo %%~j
pauseCOPY
1

评分人数

    • batman: 好,效率能否再提?PB + 20

TOP

排序很容易,现在最心痛的是效率...
@echo off&setlocal enabledelayedexpansion
set tab=[tab]
::请手动替换[tab]为tab键
set "dq=%tab%%tab%%tab%%tab%%tab%%tab%%tab%%tab%%tab%%tab% "
for /f "delims=" %%a in (a.txt) do (
set "tmp=%%a"
for %%b in ("!tmp:%tab%=" "!") do (
set /a n=n%%50+1
for %%z in (!n!) do set .!n!=!.%%z!^|%%~b
)
)
for /l %%a in (1 1 50) do (
set tmp=
set m= %%a
for %%b in ("\!.%%a!") do set tmp=!%%~b!
set \!.%%a!=*!tmp! !m:~-2!
)
(@echo off
for /f "tokens=1* delims=\=*" %%a in ('set\^^^|findstr "**"') do (
for /f "tokens=* delims=^|" %%c in ("%%a") do echo%%b相同,内容为:%dq%%%c%dq%
))|sort
pauseCOPY
1

评分人数

    • batman: 好,居然用上了退格!PB + 8

TOP

少用set *和|findstr这样的语句,太影响效率了。。。

既然有人用上了退格,是不是可以考虑多行回退,呵呵。。。

[ 本帖最后由 batman 于 2011-3-11 12:40 编辑 ]
***共同提高***

TOP

本来想写成一行判断一次,这样只需要一个for,而无须把整个代码“横过来”,不过懒啊...
若非一行有50列,就可以直接用tokens了

TOP

呃,我用退格不是为了多行回退...仔细看下会发现我用的是[十个tab][一个空格][80个退格键],目的就是利用退格键不能跨行的特点来对齐超过一行的内容,这样可以把两行当成一行来排序,但却显示为两行。
那个空格是特意用来隔开tab和空格的,免得效果变成退行。

TOP

就现思路效率很难提升了 或许有其他路径走
最多也就16楼的第二段上简化下 但效率差不多 也就不在上面改了
for /l %%i in (1 1 %n%) do (
    for %%j in ("!l_%%i:~1!") do (
        if "!-%%j:*列=!" equ "" set /a m+=1&set __!m!=%%j
        set "-%%j=!-%%j! %%i列"
    )
)COPY

TOP

只写个找相同项的演示代码
@echo off&setlocal enabledelayedexpansion
for /l %%a in (1,1,50) do (
    set nums=!nums! %%a
    set _%%a=### !random:~-1! ### ### !random:~-1!  ###
)
for /l %%a in (1,1,50) do (
    set nums=!nums: %%a=!
    set yn=%%a
    for %%b in (!nums!) do (
if "!_%%a!" equ "!_%%b!" (
   set nums=!nums: %%b=!
   set yn=!yn! %%b
)
    )
    if "!yn!" neq "%%a列" (
echo; !yn! 相同,内容为:
echo;!_%%a!
echo;
    )
)COPY

TOP

效率总还是问题

@echo off&setlocal enabledelayedexpansion
set "t=%time%"
for /f "delims=" %%a in (a.txt) do (
  set /a m=0,n+=1
  set "str=%%a"&set "str=!str: =空!"
  for %%a in (!str!) do (
    set /a m+=1
    for %%b in (!m!) do (
      set "_%%b=!_%%b!|%%a"
        if !n! equ 50 (
          for %%c in (!_%%b!) do (
             if not defined %%c (
               set "%%c=%%b列"
               ) else (
               if defined .%%c (
                 for /f "tokens=2 delims=列 " %%d in ("!.%%c!") do set "..%%d=!..%%d! %%b列"
                   ) else (
                   set "..%%b=!%%c! %%b列"&set ".%%c=!..%%b!"
                 )
               )
             )
           )
       )
   )
)
for /l %%a in (1,1,%m%) do (
    if defined ..%%a (
       set "str=!_%%a:~1!
       echo !..%%a!内容相同,列内容如下:
       echo !str:空= !&echo.
    )
)
echo %t%
echo %time%
pause>nulCOPY
***共同提高***

TOP

贴一个正统的解法
只为提供一种思路
为了增强代码的可读性
比较大的牺牲了效率
据说将变量名和值改为简短的英文可以提高部分效率
有心人可以试试
另外,没有细看其它人的代码
算法如有雷同,纯属巧合

@echo off & setlocal EnableDelayedExpansion
rem 清空环境变量空间,防止被意外变量影响
for /f "delims==" %%e in ('set') do set %%e=
set 起始时间=%time%
rem 逐行读取测试文本
for /f "delims=" %%l in (a.txt) do (
    set "某行=%%l"
    set "某行=!某行: =空格!
set 列序号=0
rem 将当前行的字符串逐个追加赋值到列变量中
for %%s in (!某行!) do (
set /a 列序号+=1
rem 将列分割符放在后面,是为了显示出字符串末尾可能存在的空格
for %%e in (_V!列序号!) do set _V!列序号!=!%%e!%%s列分割符
)
)
rem 整理得到的所有整列
for /l %%i in (1,1,!列序号!) do (
set "某整列=!_V%%i!"
if not defined !某整列! (
set "!某整列!=%%i列"
) else (
for %%d in (!某整列!) do set "!某整列!=!%%d! %%i列"
set 重复列=!重复列! !某整列!
)
)
for %%c in (%重复列%) do (
echo !%%c!内容相同,列内容如下:
set "列内容=%%c"
set "列内容=!列内容:空格= !"
set "列内容=!列内容:列分割符=|!"
echo !列内容!
echo.
)
echo %起始时间%
echo %time%COPY

[ 本帖最后由 qzwqzw 于 2011-3-12 22:48 编辑 ]
天的白色影子

TOP

发错地方...

TOP

返回列表