中国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
........


我想了好久,但是脚本老是不能正常运行。
参见帖子,http://www.cn-dos.net/forum/view ... id=pyhnrc#pid330725
不过现在是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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: