Board logo

标题: 请教一个文本排列问题 [打印本页]

作者: haiyuey     时间: 2009-4-20 23:51    标题: 请教一个文本排列问题
文本为:
王一,2
王一,5
张二,4
张二,5
张二,8
刘三,2
求输出结果为:
王一,2 5
张二,4 5 8
刘三,2

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

作者: haiyuey     时间: 2009-4-21 03:21
没人知道吗?

作者: hongewuyan     时间: 2009-4-21 03:53


@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版本以上应该可以.

作者: tireless     时间: 2009-4-21 04:23
@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

作者: haiyuey     时间: 2009-4-21 04:29
三楼这个好像不行,数据换一个排列再执行就没用了!

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

作者: haiyuey     时间: 2009-4-21 04:34
三楼的不行,四楼的应该可以,先谢过,再试下

作者: sady2009     时间: 2009-4-21 07:19
名字是连着排列的吗? 还是打乱的?

作者: netbenton     时间: 2009-4-21 07:27
不管是打乱,还是连着的都可以
@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 ]

作者: freeants001     时间: 2009-4-21 07:29
set "var2=%var:*,=%"中竟然可以使用通配符,感谢tireless的代码,学了一招,呵呵~~

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

作者: tireless     时间: 2009-4-21 08:12    标题: Re 10楼
http://technet.microsoft.com/en-us/library/bb490954.aspx


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 ]

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


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

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

作者: jmz573515     时间: 2009-4-21 22:43

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)

作者: freeants001     时间: 2009-4-22 00:17
fso=WScript.createobject("scripting.filesystemobject");
sss=fso.opentextfile("a.txt").readall();
re=/((?:\n|^)(+),+)\r\n((?:.*\r\n)*?)(?:\2,(+\r\n))/
while(re.test(sss))sss=sss.replace(re,"$1 $4$3");
fso.createtextfile("a_dest.txt",1,0).write(sss)

作者: tireless     时间: 2009-4-22 00:40    标题: 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 ]

作者: THENEWLIFE     时间: 2009-4-22 02:34
RIRELESS
谢谢,大大讲的很详细,已经明白了