[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 idwma 于 2021-6-26 10:41 编辑

新的灵感
稍做修改
@echo off&setlocal EnableDelayedExpansion
set out=ffff.txt
del !out!
set d=3

for /f "delims=" %%k in ('dir/b *.prt') do (
        set na=%%~nk
        set na=!na:~0,4!-!na:~5,4!-!na:~9,4!-!na:~12,5!-!na:~16!

        for /f "delims=" %%i in (%%k) do (
                set b=%%i
                for /l %%j in (1,1,30) do (
                        if "!b:~0,3!" equ "  %%j" set e=!b:~0,85! & set d=0
                        if "!b:~0,4!" equ "   %%j" set e=!b:~0,85! & set d=0
                )
                if  "!b:~0,11!" equ  "           " (if !b:~-3! neq NPD  set c=!c!!b:~11! & set d=1)
                if "!d!" equ "1" set f=!na!   !e:~0,49!!c!          !e:~-38!
                if "!d!" equ "0"   echo;!f! >> !out! && set "c=" & set "f=" & set d=1

        )
        set d=3
)
echo;!f! >> !out!

pause
1

评分人数

TOP

最稳妥的应该这样:导出为csv格式。

TOP

本帖最后由 jave000 于 2021-6-26 22:36 编辑

回复 48# WHY


    不知道为啥,这个论坛我上传不了附件和图片。
我的第二列是元件描述,这个描述包含了第二行第三行第四行等若干行,这些都要合并到第一行的描述里

样本(bisca321ag12lr009m1.prt):
   1    INSERTED NOZZLE, CS 9901, PP/UP-GF PIPE   200X50       I143276             1
           CLASS B, LAMINATED END, LAMINATED
           END, , DN 200 X 50 - 208 X 13 MATING
           DIMENSION 208 X 2.7


成品(自动分列,管号这一列放在哪无所谓,但要大写):
   1    INSERTED NOZZLE, CS 9901, PP/UP-GF PIPE CLASS B, LAMINATED END, LAMINATED END, , DN 200 X 50 - 208 X 13 MATING DIMENSION 208 X 2.7   200X50       I143276             1          BISC-A321-AG12-LR009-M1

TOP

本帖最后由 jave000 于 2021-6-26 23:15 编辑

回复 49# idwma


你好,谢谢,运行有报错,但是我偶然运行出了一次结果,很接近需要了,只是4、4、4、5、1+的判断错了,可以下载我一楼发的附件链接
我在你代码里没看到有写路径,不知道这个路径是怎么从代码里体现出来的
“找不到 E:\Downloads\PRT\ffff.txt”

TOP

三种分列方式,对比,还是按宽度截取,最佳
  1. $pathSour = ".\prt"
  2. $fileDest = "11"
  3. [System.Collections.ArrayList] $alc = @()
  4. $res1 = "^\s{2,3}\d{1,2}\s{4}.+"
  5. $res2 = "^\s{11}\S.+"
  6. $rea = "$res1" + "|" + "$res2"
  7. $renfs = "(\w{4})(\w{1,4})?(\w{1,4})?(\w{1,5})?(.*)"
  8. $renfd = "`$1-`$2-`$3-`$4-`$5"
  9. $rew = "^(.{4})(.{46})(.{13})(.{15})(.+)"
  10. $re2s = '^\s{2,3}(\d{1,2})\s{4,}(.+?)(?<=\S)\s{2,}(\d+(?:X\d+)?)\s{2,}(\S+(?:\s\S+)*)\s{2,}([\d]+(?:[.]\d+)?(?:\sM)?)$'
  11. $re2d = "`t`$1`t`$2`t`$3`t`$4`t`$5"
  12. get-childitem -path $pathSour "*.prt" | foreach-object {
  13.     write-host $_.basename
  14.     $fc = (get-content -Encoding utf8 $_.fullname) -match $rea
  15.     for ($i = 0 ; $i -lt $fc.count ; $i++)
  16.     {
  17.         if ($fc[$i] -match "^\s{2}[\s\d]\d\s{4}")
  18.         {
  19.             $s1 = $fc[$i]
  20.             # 以3+空格
  21.             $a1 = (" " + $s1) -replace "(?<=\S)  (?=\d)","   " -split "   +"
  22.             $a1line1 = $a1 -join "`t"
  23.             #re2s
  24.             $a2line1 = $s1 -replace $re2s,$re2d
  25.             # 宽度
  26.             $s1 -match $rew | out-null
  27.             $aw = @("") * 6
  28.             for ($j = 1 ; $j -le 5 ; $j++)
  29.             {
  30.                 $aw[$j] = $matches[$j].trim()
  31.             }
  32.             $awline1 = $aw -join "`t"
  33.             
  34.             if ( ($a1line1 -ne $awline1 ) -or ($a2line1 -ne $awline1 ))
  35.             {
  36.                 $alc.add( $_.basename + "`n" + $s1) | out-null
  37.                 $alc.add( "1" + $a1line1 + "`n" + "2" + $a2line1 + "`n" + "w" + $awline1 + "`n" ) | out-null
  38.             }
  39.         }
  40.     }
  41. }
  42. $alc | out-file -encoding utf8 ($fileDest + "-c.txt")
复制代码
下面12w开头的行,对应三种方式
  1. mdiv610ab21lr0035
  2.   21    SEE PIPING SPECIAL SUPPORT DRAWING                     SS1139             1
  3. 1 21 SEE PIPING SPECIAL SUPPORT DRAWING SS1139 1
  4. 2  21    SEE PIPING SPECIAL SUPPORT DRAWING                     SS1139             1
  5. w 21 SEE PIPING SPECIAL SUPPORT DRAWING SS1139 1
复制代码

TOP

用这个正则,和宽度分列一样了
  1. $re2s = '^\s{2,3}(\d{1,2})\s{4,}(.+?)(?<=\S)\s{2,}(\d*(?:\s?X\d+)?)\s{2,}(\S+(?:\s\S+)*)\s{2,}([\d]+(?:[.]\d+)?(?:\sM)?)$'
复制代码

TOP

本帖最后由 idwma 于 2021-6-27 19:29 编辑

回复 52# jave000


    完美匹配
改一下加几个分号可以自动分
再改一下,分号还是不稳改制表符来分隔
@echo off&setlocal EnableDelayedExpansion
set out=aa.txt
set d=3
for /f "delims=" %%a in ('mshta "about:<script>new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write("\t\t");close();</script>"') do set tab=%%a

for /f "delims=" %%k in ('dir/b *.prt') do (
        set na=%%~nk
        set na=!na:~0,4!-!na:~4,4!-!na:~8,4!-!na:~12,5!-!na:~17!
        call :con
        for /f "delims=" %%i in (%%k) do (
                set b=%%i
                for /l %%j in (1,1,30) do (
                        if "!b:~0,3!" equ "  %%j" set e=!b:~0,85! & set d=0
                        if "!b:~0,4!" equ "   %%j" set e=!b:~0,85! & set d=0
                )
                if "!d!" equ "0" call :ff
                if  "!b:~0,11!" equ  "           " (if !b:~-3! neq NPD  set c=!c!!b:~11! & set d=1)
                if "!d!" equ "1" set f=!na! !tab! !eee!!c! !tab! !e:~50,13! !tab! !e:~63,15! !tab! !e:~-5!
                if "!d!" equ "0"   echo;!f! >> !out! && set "c=" & set "f=" & set d=1
                echo;!f!
        )
        set d=3
)
echo;!f! >> !out!
pause
exit

:ff
for /l %%m in (49,-1,1) do (
        set ee=!e:~0,49!
        set eee=!ee:~1,%%m!
        if not "!b:~%%m,1!" == " "  goto :EOF
)

:con
for %%m in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do call set na=%%na:%%m=%%m%%
1

评分人数

TOP

本帖最后由 WHY 于 2021-6-29 00:00 编辑

回复 51# jave000
  1. $fd  = 'E:\Test\PRT';     #存放prt文件的目录路径
  2. $reg = '(?-i)^\s+(\d+)\s+(.+)(?<!\s)\s+(\d+(?:X\d+)?)\s+(.+)(?<![\sX])\s+(\d+(?:\.\d+)?)(?>\s+M)?$';
  3. [Collections.ArrayList]$out = @();
  4.       
  5. forEach ( $f In (dir $fd -Filter *.prt) ){
  6.     $flag = $false;
  7.     $name = $f.BaseName.ToUpper();
  8.     $name = $name -replace '^(....)(....)(....)(.....)(.+)$', '$1-$2-$3-$4-$5';
  9.     forEach ( $s In @(gc $f.FullName) ){
  10.         if ( $s -match $reg ){
  11.             if ( $flag ){
  12.                 [void]$out.Add( '"' + ($arr -join '","') + '"' );
  13.             }
  14.             $arr = @( '', '', '', '', '', $name );
  15.             for ( $i=1; $i -le 5; $i++ ){ $arr[$i-1] = $matches[$i].Replace('"', '""'); }
  16.             $flag = $true;
  17.         } elseif ( $s -match '^ {11}(\S.*)'){
  18.             $arr[1] += ' ' + $matches[1].Replace('"', '""');
  19.         }
  20.     }
  21.     if ( $flag ){
  22.        [void]$out.Add(  '"' + ($arr -join '","') + '"' );
  23.     }
  24. }
  25. sc 1.csv $out;
复制代码
个别文件描述列本身包含了双引号,比如:mmdiv710ds22lr0121.prt,格式发生错乱
已修改。
1

评分人数

    • jave000: 大神代码,只看懂一点点技术 + 1

TOP

回复 55# idwma


可能是运行模式不同,这个运行很慢。
我试了你的初始代码,生成的txt,复制到excel后会中间穿插空白列,序号和描述列也没有分开。但是更加完善了。
我把代码里的txt改成csv,生成的csv和刚才的txt一样大,但是分列很混乱了,没有想到这俩会有差别。
正文部分我一点也没看懂
末尾exit后还可以加代码我第一次见,也不知道是什么意思
涨知识了,谢谢

TOP

回复 56# WHY


    尝试运行了一下,没有发现任何问题。
明天到公司再试试一些别的prt文件
感谢大神

TOP

  1. $pathSour = ".\prt"
  2. $fileDest = "22"
  3. if (-not ([string]::IsNullOrEmpty($args[0])))
  4. {
  5.     $pathSour = $args[0]
  6. }
  7. remove-item $fileDest*.*
  8. [System.Collections.ArrayList] $al = @()
  9. $rem = "^\s{3}\d{1}|^\s{2}\d{2}|^\s{11,12}\S.+"
  10. $renfs = "(\w{4})(\w{1,4})?(\w{1,4})?(\w{1,5})?(.*)"
  11. $renfd = "`$1-`$2-`$3-`$4-`$5"
  12. $res = "`n(.{4})(.{46})(.{13})(.{15})(.+)((?:`n\s{11,12}.+)*)"
  13. #$res = "`n\s{2,3}(\d{1,2})\s{4,}(\S.+?\S)\s{2,}(\d+(?:X\d+)?)\s{2,}(\S+(?:\s\S+)*)\s{2,}(\d+(?:[.]\d+)?(?:\sM)?)((?:`n\s{11,12}.+)*)"
  14. $red = "`t`$1`t`$2`$6`t`$3`t`$4`t`$5::"
  15. get-childitem -path $pathSour "*.prt" | foreach-object {
  16.     write-host "  "$_.basename
  17.     $nf = $_.basename.ToUpper() -replace $renfs,$renfd -replace "-+$","";
  18.     $a = "`n" + (((get-content -Encoding utf8 -path $_.fullname ) -match $rem) -join "`n") ;
  19.     if ( $a.length -gt 0 )
  20.     {
  21.         $a = $a -replace $res,$red -replace "[ `n]+"," " -replace " *`t *","`t"
  22.         $a = $a -replace "::$","" -replace "::","`n" -replace "(?m)\sm$","" -replace "(?m)^(?=`t)",$nf
  23.         $al.add($a) | out-null
  24.     }
  25. }
  26. $al | out-file -encoding utf8 ($fileDest + "-a.txt")
复制代码

TOP

返回列表