中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
<<   [1] [2]  >>   >
作者:
标题: 合并多张表, 添加数据项。 上一主题 | 下一主题
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『楼 主』:  合并多张表, 添加数据项。

如何把附件中的三张表合并起来,要求是这样的: 如果在MAIN.TXT 中的第一列发现包含字符串“DEN” ,然后按照第二列的信息(ERP / SOL),则从 ERP.TXT 或 SOL.TXT中的内容调出一个记录,并加在MAIN.TXT 的第三列上。如果不符合条件,就不加任何数据项在第三列上。 结果大致是这样的: MAIN.TXT ADMIN , SOL , DDIC , SOL , DDIC , ERP , DDIC , ERP , DDIC , ERP , FIDEMO , ERP , J2EE_ADMIN , ERP , SAP* , ERP , SAP* , ERP , SAPUSER , ERP , SOLMAN , ERP , SPDEMO , ERP , SPDEMO , ERP , WDDEMO , ERP , WDDEMO , SOL , STUDENT01 , ERP , rqrew STUDENT01 , ERP , ewe STUDENT02 , SOL , 4312 STUDENT02 , SOL , 4431 STUDENT03 , ERP , fdfdd STUDENT03 , ERP , kjlkj STUDENT04 , SOL , 4554 STUDENT04 , SOL , 443 STUDENT05 , SOL , 78687 STUDENT05 , ERP , oioi ........ 我想了好久,但是脚本老是不能正常运行。 参见帖子,www.cn-dos.net/forum ... 不过现在是3张表了,情况复杂了。 set ListName=ERP SOL for %%i in (%ListName%) do (call :Add_record %%i) GOTO :EOF :: ++++++++++++++++++++++++++++++++++++++++++++++ :Add_record setlocal enabledelayedexpansion set n= for /f "eol=# tokens=1" %%i in (%1.txt) do ( set /a n+=1 set NUM_!n!=%%i ) set n= for /F "eol=# tokens=1-3 delims=," %%A in (main.txt) do ( if "%%C"=="" (echo %%A|find /i "ENT") if NOT ERRORLEVEL 1 if "%%B"=="%1" ( set /a n+=1 for %%G in (NUM_!n!) do (echo.%%A ,%%B , !%%C!<nul>>main.txt.tmp ) ) else ( echo.%%A , %%B<nul>>main.txt.tmp) ) copy /y Instance.cfg.tmp main.txt & del /f /q main.txt.tmp endlocal goto :eof :: ++++++++++++++++++++++++++++++++++++++++++++++ [ Last edited by uiopuiop on 2009-4-25 at 07:25 ]


附件 1: test table.zip (2009-4-25 06:34, 534 bytes,下载次数: 9)
2009-4-25 06:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
freeants001
中级用户




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

如果在MAIN.TXT 中的第一列发现字符串为“DEN”,是子串吧,下载的符件没有发现字符串"DEN",只有子串"DEN"


2009-4-25 06:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 3 楼』:  

Originally posted by freeants001 at 2009-4-25 06:53 AM: 如果在MAIN.TXT 中的第一列发现字符串为“DEN”,是子串吧,下载的符件没有发现字符串"DEN",只有子串"DEN"
对的是包含字符串 "DEN", 没说清楚,更正了。


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

批处理编程迷


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

偶想到了一个纯批的方法,暂不公布,看看有没有更好的。^_^




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





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 5 楼』:  

Originally posted by netbenton at 2009-4-25 07:12 AM: 偶想到了一个纯批的方法,暂不公布,看看有没有更好的。^_^
纯批好,有好主意就拿出来看看吧,说不定别人也会有什么启发,谢谢啦!昨天晚上我想到两点半都没想出来,我的脚本嵌套太多了,自己都搞不清楚。 [ Last edited by uiopuiop on 2009-4-25 at 07:38 ]


2009-4-25 07:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
freeants001
中级用户




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

终于排除错误了,很苯的方法~~
@echo off&setlocal enabledelayedexpansion
del $dest$.txt>nul 2>nul
for /f "tokens=1,2 delims=, " %%i in (main.txt) do (
    echo "%%~i"|findstr /c:"DEN">nul&& set /a flag=1
    if !flag! equ 1 (
        if /i "%%~j" equ "erp" (
            call:erp "%%~i" "%%~j"
        ) else (
            if /i "%%~j" equ "SOL" (
                call:sol "%%~i" "%%~j"
            ) else (
                echo %%~i, %%~j>>$dest$.txt
            )
        )
    ) else (
        echo %%~i, %%~j>>$dest$.txt
    )
    set /a flag=0
)
pause
goto:eof

:erp
set col3=
for /f "%mm%" %%i in (erp.txt) do (set col3=%%i&goto:out1)
:out1
echo %~1, %~2, %col3%>>$dest$.txt
set /a m+=1
set mm=skip^=%m%
goto:eof

:sol
set col3=
for /f "%nn%" %%i in (sol.txt) do (set col3=%%i&goto:out2)
:out2
echo %~1, %~2, %col3%>>$dest$.txt
set /a n+=1
set nn=skip^=%n%
goto:eof
[ Last edited by freeants001 on 2009-4-26 at 04:01 ]


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

批处理编程迷


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

@echo off&setlocal enabledelayedexpansion
set sol=sol
set erp=erp
set main=main
set den=DEN

set n=0&for /f %%a in (%sol%.txt) do (set/a n+=1&set #%sol%!n!=%%a)
set n=0&for /f %%a in (%erp%.txt) do (set/a n+=1&set #%erp%!n!=%%a)
set n#%sol%=0
set n#%erp%=0

for /f "tokens=1-3 delims=, " %%a in (%main%.txt) do (
	set one=%%a
	set three=
	if not "!one:*%den%=!"=="!one!" (
		set/a n#%%b+=1
		call set three=%%#%%b!n#%%b!%%
	)
	set str=%%a , %%b ,  !three!
)
		
pause
多出了一点,删掉了。 [ Last edited by netbenton on 2009-4-25 at 06:11 ]




精简 [你的+我的+他的]=>[大家的] 个人网志
2009-4-25 08:07
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
tireless
银牌会员





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

@echo off&setlocal enabledelayedexpansion
for %%a in (ERP SOL) do (
  set n=
  for /f "delims=" %%i in (%%a.txt) do (
    set /a n+=1
    set %%a!n!=%%i
  )
)

(for /f "tokens=1,2 delims=, " %%a in (main.txt) do (
  set var=%%a
  if "!var:DEN=!" neq "%%a" (
    set /a %%b+=1
    for %%i in (%%b!%%b!) do echo %%a , %%b , !%%i!
  ) else echo %%a , %%b
))>main_new.txt


   此帖被 +11 点积分        点击查看详情   
评分人:【 netbenton 分数: +5  时间:2009-4-25 08:15
评分人:【 freeants001 分数: +2  时间:2009-4-25 08:42
评分人:【 uiopuiop 分数: +4  时间:2009-4-25 08:45


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

批处理编程迷


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

8楼的: for %%i in (%%b!%%b!) do echo %%a , %%b , !%%i! 用得好,加分




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





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 10 楼』:  to: tireless

老是麻烦tireless兄,正是太感激了 ~~~~ 尽我力量给你加了4分,别嫌少啊。 if "!var:DEN=!" neq "%%a" 用的也很巧妙 :)


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

批处理编程迷


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

来个另类的,不用 if 也可以做到
@echo off&setlocal enabledelayedexpansion
set sol=sol
set erp=erp
set main=main
set den=DEN

set n=0&for /f %%a in (%sol%.txt) do (set/a n+=1&set #%sol%!n!=%%a)
set n=0&for /f %%a in (%erp%.txt) do (set/a n+=1&set #%erp%!n!=%%a)

for /f "tokens=1-3 delims=, " %%a in (%main%.txt) do (
	set one=%%a
	set !one:*%den%=!=%%b
	set !one!=
		for /f %%i in ("!one:*%den%=!") do (
			set/a #!%%i!+=1,nn=#!%%i!
			for /f "tokens=1,2" %%j in ("!nn! !%%i!") do (
				echo %%a , %%b , !#%%k%%j!
			)
		)
)
		
pause




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





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 12 楼』:  

Originally posted by tireless at 2009-4-25 08:10 AM: [code]@echo off&setlocal enabledelayedexpansion for %%a in (ERP SOL) do ( set n= for /f "delims=" %%i in (%%a.txt) do ( set /a n+=1 set %%a!n!=%%i ) ) (for /f ...
突然想到,如果第二列的信息(ERP / SOL),类型多于2个的话,应该这么办?比如有可以能是3个 (ERP1, ERP2, SOL1 ) 或 4个等 , 有没有办法让程序变的灵活点??? [ Last edited by uiopuiop on 2009-4-25 at 09:13 ]


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





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

@echo off&setlocal enabledelayedexpansion
set 类型=ERP SOL ERP1 ERP2 SOL1
for %%a in (%类型%) do (
  set n=
  for /f "delims=" %%i in (%%a.txt) do (
    set /a n+=1
    set %%a_!n!=%%i
  )
)

(for /f "tokens=1,2 delims=, " %%a in (main.txt) do (
  set var=%%a
  if "!var:DEN=!" neq "%%a" (
    set /a %%b+=1
    for %%i in (%%b_!%%b!) do echo %%a , %%b , !%%i!
  ) else echo %%a , %%b
))>main_new.txt


   此帖被 +4 点积分        点击查看详情   
评分人:【 uiopuiop 分数: +4  时间:2009-4-25 10:18


2009-4-25 10:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
uiopuiop
中级用户





积分 400
发帖 211
注册 2007-9-30
状态 离线
『第 14 楼』:  RE: 第 13 楼

多谢了,牛人啊~~~ 救我于苦难之中。。。。 怪我没很好的理解下面语句的意思: set /a %%b+=1 for %%i in (%%b_!%%b!) do echo %%a , %%b , !%%i! [ Last edited by uiopuiop on 2009-4-25 at 10:19 ]


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





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

先设置了这些变量: ERP_1 ERP_2 ERP_3 ... SOL_1 SOL_2 SOL_3 ... set /a %%b+=1 假如 %%b 为 ERP,则变量 ERP 的数值每次加 1,然后 !ERP_1! , !ERP_2! ... 就引用了之前设置好的变量


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


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



论坛跳转: