标题: [文本处理] [已解决]把文本方块旋转的BAT代码错在哪里? [打印本页]
作者: 悬崖之树 时间: 2013-7-13 18:39 标题: [已解决]把文本方块旋转的BAT代码错在哪里?
也就是让文本延对角线旋转180度。- @echo off
- setlocal enabledelayedexpansion
- set m=0&set n=0
- for /f %%a in (1.txt) do (
- set /a m+=1
- for %%b in (%%a) do (
- set /a n+=1
- set "s!m!!n!=%%b"
- )
- set i=!n!
- set n=0
- )
- for /l %%a in (1 1 %i%) do (
- for /l %%b in (1 1 %m%) do (
- set /p=!s%%b%%a! <nul
- )
- echo.
- )
- pause
复制代码
作者: 悬崖之树 时间: 2013-7-13 18:51
这个也不行:- @echo off
- setlocal enabledelayedexpansion
- set m=0&set n=0
- for /f %%a in (1.txt) do (
- set /a m+=1
- for %%b in (%%a) do (
- set /a n+=1
- call set s%%!m!%%%%!n!%%=%%b
- )
- set i=!n!
- set n=0
- )
- pause
- for /l %%a in (1 1 %i%) do (
- for /l %%b in (1 1 %m%) do (
- set /p=!s%%b%%a! <nul
- )
- echo.
- )
- 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
这样- @echo off&setlocal enabledelayedexpansion
- set m=0&set n=0
- for /f "delims=" %%a in (1.txt) do (
- set /a m+=1,n=0
- for %%b in (%%a) do (
- set /a n+=1
- set "$!m!_!n!=%%b"
- )
- )
-
- for /l %%a in (1 1 %n%) do (
- for /l %%b in (1 1 %m%) do (
- set /p=!$%%b_%%a! <nul
- )
- echo.
- )
- pause
复制代码
作者: xxpinqz 时间: 2013-7-13 19:50
是这样吗- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- set n=10000
- for %%b in (%%a) do (
- for %%c in (!n!) do (
- if defined #%%c (
- set "#%%c=!#%%c! %%b"
- ) else (
- set "#%%c=%%b"
- )
- set/a n+=1
- )
- )
- )
- (for /f "tokens=1* delims==" %%a in ('set #') do (
- echo,%%b
- ))>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
我来给你优化一下:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- set n=0
- for %%b in (%%a) do (
- call set #!n!=%%#!n!%% %%b
- set /a n+=1
- )
- )
- for /f "tokens=1* delims==" %%a in ('set #') do echo,%%b
- 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中去除第一个空格可以用下面的代码:- for /f "tokens=*" %%i in (" a b c ") do echo %%i
复制代码
作者: xxpinqz 时间: 2013-7-13 21:29
本帖最后由 xxpinqz 于 2013-7-13 21:34 编辑
回复 12# 悬崖之树
前面回答的两位才是大神
是的,可以精简成:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt)do (
- set n=10000
- for %%b in (%%a)do (
- for %%c in (!n!)do set "#%%c=!#%%c! %%b"
- set/a n+=1
- )
- )
- (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 |