Board logo

标题: [文本处理] [已解决]把文本方块旋转的BAT代码错在哪里? [打印本页]

作者: 悬崖之树    时间: 2013-7-13 18:39     标题: [已解决]把文本方块旋转的BAT代码错在哪里?

也就是让文本延对角线旋转180度。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set m=0&set n=0
  4. for /f %%a  in (1.txt) do (
  5.    set /a m+=1
  6.    for %%b in (%%a) do (
  7.       set /a n+=1
  8.       set "s!m!!n!=%%b"      
  9.    )
  10.    set i=!n!
  11.    set n=0
  12. )
  13. for /l %%a in (1 1 %i%) do (
  14.    for /l %%b in (1 1 %m%) do (
  15.       set /p=!s%%b%%a! <nul
  16.    )
  17.    echo.
  18. )
  19. pause
复制代码

作者: 悬崖之树    时间: 2013-7-13 18:51

这个也不行:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set m=0&set n=0
  4. for /f %%a  in (1.txt) do (
  5.    set /a m+=1
  6.    for %%b in (%%a) do (
  7.       set /a n+=1
  8.       call set s%%!m!%%%%!n!%%=%%b      
  9.    )
  10.    set i=!n!
  11.    set n=0
  12. )
  13. pause
  14. for /l %%a in (1 1 %i%) do (
  15.    for /l %%b in (1 1 %m%) do (
  16.       set /p=!s%%b%%a! <nul
  17.    )
  18.    echo.
  19. )
  20. pause
复制代码

作者: CrLf    时间: 2013-7-13 19:48

本帖最后由 CrLf 于 2013-7-13 19:52 编辑

你没加 "delims="

本来想发个自己写的awk,但搜了下发现大牛的代码更给力,就不献丑了:
http://bbs.chinaunix.net/thread-3703243-1-1.html
作者: terse    时间: 2013-7-13 19:48

这样
  1. @echo off&setlocal enabledelayedexpansion
  2. set m=0&set n=0
  3. for /f "delims=" %%a  in (1.txt) do (
  4.    set /a m+=1,n=0
  5.    for %%b in (%%a) do (
  6.       set /a n+=1
  7.       set "$!m!_!n!=%%b"
  8.    )
  9. )
  10. for /l %%a in (1 1 %n%) do (
  11.    for /l %%b in (1 1 %m%) do (
  12.       set /p=!$%%b_%%a! <nul
  13.    )
  14.    echo.
  15. )
  16. pause
复制代码

作者: xxpinqz    时间: 2013-7-13 19:50

是这样吗
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     set n=10000
  4.     for %%b in (%%a) do (
  5.        for %%c in (!n!) do (
  6.            if defined #%%c (
  7.                set "#%%c=!#%%c! %%b"
  8.            ) else (
  9.                set "#%%c=%%b"
  10.            )
  11.            set/a n+=1
  12.        )
  13.     )
  14. )
  15. (for /f "tokens=1* delims==" %%a in ('set #') do (
  16.     echo,%%b
  17. ))>2.txt
复制代码

作者: terse    时间: 2013-7-13 19:58

awk 利用 NR NF 省去计算  爽
作者: 悬崖之树    时间: 2013-7-13 20:14

回复 5# xxpinqz
可以解释一下原理吗?
那个 'set #'是列出所有的#开头的变量吗?
作者: 悬崖之树    时间: 2013-7-13 20:44

回复 5# xxpinqz
我来给你优化一下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     set n=0
  4.     for %%b in (%%a) do (
  5.        call set #!n!=%%#!n!%% %%b
  6.        set /a n+=1
  7.     )
  8. )
  9. for /f "tokens=1* delims==" %%a in ('set #') do echo,%%b
  10. pause
复制代码

作者: xxpinqz    时间: 2013-7-13 20:46

回复 7# 悬崖之树
是的。。。
其实原理和你的大同小异,你的是一个字符定义为一个变量,我的是一列定义为一个变量。
作者: xxpinqz    时间: 2013-7-13 20:51

本帖最后由 xxpinqz 于 2013-7-13 20:53 编辑

回复 8# 悬崖之树
用FOR来扩展比CALL效率高
如果不加入if defined #%%c 判断,则输出到文本后会导致要么前面多一个空格,要么后面多一个空格,当然也可以再最后一句FOR中去除就是了。
set n=0,初始N定义最好大一点,原因在于set #时的排序,#10是排在#2之前的,行数超过10个的话会出错.因为你每行都一样,所以看起来没错
作者: 悬崖之树    时间: 2013-7-13 20:58

回复 10# xxpinqz


    真是有你一套的,服了。
作者: 悬崖之树    时间: 2013-7-13 21:06

回复 10# xxpinqz
在最后的for中去除第一个空格可以用下面的代码:
  1. for /f "tokens=*" %%i in (" a b c  ")  do echo %%i
复制代码

作者: xxpinqz    时间: 2013-7-13 21:29

本帖最后由 xxpinqz 于 2013-7-13 21:34 编辑

回复 12# 悬崖之树
前面回答的两位才是大神

是的,可以精简成:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt)do (
  3.     set n=10000
  4.     for %%b in (%%a)do (
  5.         for %%c in (!n!)do set "#%%c=!#%%c! %%b"
  6.         set/a n+=1
  7.     )
  8. )
  9. (for /f "tokens=1* delims== " %%a in ('set #')do echo,%%b)
复制代码

作者: PowerShell    时间: 2013-7-14 09:19

汗呀,原来是行列转换,用excel来做最简单了:就是复制,粘贴时选转置。
当然了,很多牛的文本编辑器也有这个功能。
如果想用脚本来完成,就用excel嵌入powershell。

就用excel嵌入powershell,就是拿powershell当查询程序,拿excel当数据库,这对组合专门处理n行m列的数据,
乃无敌小能手,真是秒啊~~~

bat vbs powershell,bat不能,vbs中已经开始用这种解题方法了,到powershell已经成为幼儿园功课了。不知道的,要被打手板了了了了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2