中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 请教一个文本排列问题 上一主题 | 下一主题
haiyuey
新手上路





积分 10
发帖 10
注册 2008-11-4
状态 离线
『楼 主』:  请教一个文本排列问题

文本为:
    王一,2
    王一,5
    张二,4
    张二,5
    张二,8
    刘三,2
求输出结果为:
   王一,2 5
   张二,4 5 8
   刘三,2

[ Last edited by haiyuey on 2009-4-21 at 00:11 ]

2009-4-20 23:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
haiyuey
新手上路





积分 10
发帖 10
注册 2008-11-4
状态 离线
『第 2 楼』:  

没人知道吗?

2009-4-21 03:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hongewuyan
初级用户





积分 65
发帖 29
注册 2008-3-24
状态 离线
『第 3 楼』:  


@echo off
setlocal ENABLEDELAYEDEXPANSION
if exist b.txt del b.txt
set m=""
for /f "tokens=1,2 delims=," %%i in (a.txt) do (
  if /i not "%%i"=="!m!" (
    >>b.txt echo %%i,%%j
    set m=%%i
        ) else (
    sed -i "s/^%%i.*/& %%j/" b.txt
    sed -i "s/$/\r/" b.txt
    set m=%%i
    )
)
以上代码我测试是可以的,不过需要你系统里面有sed这个命令,论坛上很好找到的,4.07版本以上应该可以.

2009-4-21 03:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 4 楼』:  


@echo off&setlocal enabledelayedexpansion
set "file=a.txt"
set /p var=<"%file%"
set "var2=%var:*,=%" & set var=!var:,%var:*,=%=!
(for /f "usebackq skip=1 tokens=1,2 delims=," %%a in ("%file%") do (
  if "%%a" neq "!var!" (
    echo !var!,!var2!
    set "var=%%a" & set var2=%%b
  ) else set var2=!var2! %%b
)
echo !var!,!var2!)>result.txt
start result.txt


   此帖被 +2 点积分    点击查看详情   
评分人:【 freeants001 分数: +2  时间:2009-4-21 07:29


2009-4-21 04:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
haiyuey
新手上路





积分 10
发帖 10
注册 2008-11-4
状态 离线
『第 5 楼』:  

三楼这个好像不行,数据换一个排列再执行就没用了!

[ Last edited by haiyuey on 2009-4-21 at 04:35 ]

2009-4-21 04:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
haiyuey
新手上路





积分 10
发帖 10
注册 2008-11-4
状态 离线
『第 6 楼』:  

三楼的不行,四楼的应该可以,先谢过,再试下

2009-4-21 04:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『第 7 楼』:  

名字是连着排列的吗? 还是打乱的?

2009-4-21 07:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 8 楼』:  

不管是打乱,还是连着的都可以
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=, " %%a in (%~n0.txt) do (set "#%%a=!#%%a!%%b ")
for /f "tokens=1,2 delims==#" %%a in ('set #') do (echo %%a,%%b)
pause
[ Last edited by netbenton on 2009-4-21 at 05:29 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-4-21 07:27
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 9 楼』:  

set "var2=%var:*,=%"中竟然可以使用通配符,感谢tireless的代码,学了一招,呵呵~~

2009-4-21 07:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『第 10 楼』:  

终于看懂了8楼老大的代码
set #用的很妙,能把#开头的变量都列出来,再用for 处理。
不知道 cmd最大可以支持多少个变量. 有数量限制吗?

2009-4-21 08:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 11 楼』:  Re 10楼

http://technet.microsoft.com/en-us/library/bb490954.aspx

  Quote:
The maximum individual environment variable size is 8192bytes.

The maximum total environment variable size for all variables, which includes variable names and the equal sign, is 65,536KB.

[ Last edited by tireless on 2009-4-21 at 08:14 ]

2009-4-21 08:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
THENEWLIFE
初级用户




积分 78
发帖 64
注册 2008-8-29
状态 离线
『第 12 楼』:  

看了很长时间还是不怎么动下面这2句,还大大门帮忙解释下
set /p var=<"%file%"
这里的VAR=<  里面的这个“<”是转义符的意思吗
意思是把FILE的值附给 VAR吧,然后用SET /P做为输入吗


set "var2=%var:*,=%" & set var=!var:,%var:*,=%=!

"var2=%var:*,=%" 里面的“*和,”的意思是把所有字符和逗号转换成空吗
var=!var:,%var:*,=%=!这句是一个变量替换的嵌套吧
意思是把%var:*,=%替换的值再和, 替换成空吗。看了很多这方便的资料
在实际应用上就不知道怎么下手,不知道我理解的对吗,还请大大门指点,最好举个实例解释下,谢谢了~

2009-4-21 22:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 13 楼』:  


set fso=createobject("scripting.filesystemobject")
set file=fso.opentextfile("1.txt")
do while file.atendofstream<>true
        n=file.readline:s=split(n,","):a=s(0):b=s(1)
        if instr(sn,a)=0 then
                n=vbcrlf &n:sn=a:sm=sm & n
        else
                sm=sm & " " &b
        end if
loop
file.close
wsh.echo mid(sm,3)


2009-4-21 22:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 14 楼』:  


fso=WScript.createobject("scripting.filesystemobject");
sss=fso.opentextfile("a.txt").readall();
re=/((?:\n|^)([^,]+),[^\r\n]+)\r\n((?:.*\r\n)*?)(?:\2,([^\r\n]+\r\n))/
while(re.test(sss))sss=sss.replace(re,"$1 $4$3");
fso.createtextfile("a_dest.txt",1,0).write(sss)


2009-4-22 00:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 15 楼』:  Re 12楼

< 是重定向符号。
set /p var= 默认是从控制台(键盘)接受输入源,这句等同于 set /p var=<con。把 con 换成文件,就是把文件作为输入源了。而变量只允许一行字符,所以只有文件的第一行设为了 var 的值。

%var:*,=% 是把第一个 , 及前面所有字符替换为空。
只有这一种通配符用法,其他的如 %var:,*=%%var:?,=% 都无效。

!var:,%var:*,=%=!
假设 var=王一,2
%var:*,=% 取得的值是 2,然后 !var:,2=! 取得的值是 王一

[ Last edited by tireless on 2009-4-22 at 09:13 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 THENEWLIFE 分数: +2  时间:2009-4-22 02:34


2009-4-22 00:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: