Board logo

标题: 合并多张表, 添加数据项。 [打印本页]

作者: uiopuiop     时间: 2009-4-25 06:34    标题: 合并多张表, 添加数据项。

如何把附件中的三张表合并起来,要求是这样的:
如果在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)

作者: freeants001     时间: 2009-4-25 06:53
如果在MAIN.TXT 中的第一列发现字符串为“DEN”,是子串吧,下载的符件没有发现字符串"DEN",只有子串"DEN"
作者: uiopuiop     时间: 2009-4-25 07:03


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

对的是包含字符串 "DEN", 没说清楚,更正了。
作者: netbenton     时间: 2009-4-25 07:12
偶想到了一个纯批的方法,暂不公布,看看有没有更好的。^_^
作者: uiopuiop     时间: 2009-4-25 07:21


  Quote:
Originally posted by netbenton at 2009-4-25 07:12 AM:
偶想到了一个纯批的方法,暂不公布,看看有没有更好的。^_^

纯批好,有好主意就拿出来看看吧,说不定别人也会有什么启发,谢谢啦!昨天晚上我想到两点半都没想出来,我的脚本嵌套太多了,自己都搞不清楚。

[ Last edited by uiopuiop on 2009-4-25 at 07:38 ]
作者: freeants001     时间: 2009-4-25 07:59
终于排除错误了,很苯的方法~~
@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 ]
作者: netbenton     时间: 2009-4-25 08:07

@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 ]
作者: tireless     时间: 2009-4-25 08:10

@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

作者: netbenton     时间: 2009-4-25 08:16
8楼的:
for %%i in (%%b!%%b!) do echo %%a , %%b , !%%i!
用得好,加分
作者: uiopuiop     时间: 2009-4-25 08:49    标题: to: tireless

老是麻烦tireless兄,正是太感激了 ~~~~
尽我力量给你加了4分,别嫌少啊。

if "!var:DEN=!" neq "%%a" 用的也很巧妙 :)
作者: netbenton     时间: 2009-4-25 08:53
来个另类的,不用 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

作者: uiopuiop     时间: 2009-4-25 09:11


  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 ]
作者: tireless     时间: 2009-4-25 10:01    标题: 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

作者: uiopuiop     时间: 2009-4-25 10:18    标题: 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 ]
作者: tireless     时间: 2009-4-25 11:09    标题: 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! ... 就引用了之前设置好的变量
作者: uiopuiop     时间: 2009-4-25 13:34
懂了,多谢楼上了。