返回列表 发帖
回复 32# newswan


    很感谢了,我觉得我要学习很久才能看懂你写的是什么
请问为什么一定要设置$pathSour = "."
之前的那个为什么设置成两个空格就运行失败
现在这个代码比较复杂,确实运行正常,就是很奇怪为什么生成的文件会大很多

TOP

回复 33# jave000


    基本没啥改的了
    $pathSour 作用是 rpt 文件夹
    数据文件长度是明确的,按长度截取很简单
    $a[0] 未使用,可以用来记录文件名、日期或者其他什么的

TOP

回复 33# jave000


    生成的文件大很多?什么意思

TOP

回复 35# newswan

当总文件数量很多时,cmd窗口会出现之前发的报错信息,不过生成结果问题不大。
发现一个错误:
       1    PIPE, SMLS, HG/T 20553, ASTM A312         80           I512908          13.5 M
           TP316L, SAWN END, CS 1000-27, DN80 -
           88.9 X 3.2



        1        PIPE, SMLS, HG/T 20553, ASTM A312 TP316L, SAWN END, CS 1000-27, DN80 - 88.9 X 3.2        80        I512908          1        3.5

此处13.5被拆开了,当我把文本复制到excel时,这个1被分到了I512908那个单元格

我觉得现在的代码太复杂了,可能会出现更多的问题,要不我还是用最开始那个双空格BUG的代码吧

TOP

回复 36# jave000
   1    PIPE, SMLS, HG/T 20553, ASTM A312         200          I512912           2.1 M
   2    PIPE, SMLS, HG/T 20553, ASTM A312         150          I512911           1.6 M
   3    PIPE, SMLS, HG/T 20553, ASTM A312         50           I512906           0.3 M
   4    PIPE, SMLS, HG/T 20553, ASTM A312         25           I512903           0.3 M
   5    PIPE, SMLS, HG/T 20553, ASTM A312         20           I512902           0.2 M
   6    CONCENTRIC REDUCER, SMLS, GB/T 12459,     200X150      I512654            1
   7    ELBOW 90 C, SMLS, GB/T 12459, 90E(L),     200          I512504            1
   8    ELBOW 90 C, SMLS, GB/T 12459, 90E(L),     50           I512498            1
   9    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   200          I512820            1
  10    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   150          I512819            1
  11    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   50           I512814            1
  12    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   25           I512799            1
  13    BLIND FLANGE, EN 1092-1, TYPE 05, SA 182  25           I512946            1
  14    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   20           I512798            1
  15    GASKET, DIN EN 1514-1-IBC, NQ,            200          I224625            1
  16    GASKET, DIN EN 1514-1-IBC, NQ,            150          I224624            2
  17    GASKET, DIN EN 1514-1-IBC, NQ,            50           I224645            1
  18    GASKET, DIN EN 1514-1-IBC, NQ,            25           I224638            2
  19    GASKET, DIN EN 1514-1-IBC, NQ,            20           I224636            1
  20    SCREWED CONNECTION, DIN EN ISO            20           I91453            16
  21    SCREWED CONNECTION, DIN EN ISO            20           I91454             8
  22    SCREWED CONNECTION, DIN EN ISO            16           I91413             4
  23    SCREWED CONNECTION, DIN EN ISO            12           I91371             4
  24    SCREWED CONNECTION, DIN EN ISO            12           I91372             8
  25    ERROR READING SPECIALTY MATERIAL          150          V710RE11F3121      1
  26    SLIDE SHOE SIDE MOVABLE COMPANY STD       200          S0W-200            1
   1    PIPE, SMLS, HG/T 20553, ASTM A312         250          I512913           0.5 M
   2    CONCENTRIC REDUCER, SMLS, GB/T 12459,     250X200      I512658            1
   3    ELBOW 90 C, SMLS, GB/T 12459, 90E(L),     250          I512505            1
   4    BLIND DISC, CS 473 PN 10 SERIES 2, SA     200          I512980            1
   5    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   250          I512821            1
   6    WELDNECK FLANGE, EN 1092-1, TYPE 11, SA   200          I512820            2
   7    GASKET, DIN EN 1514-1-IBC, NQ,            250          I224614            1
   8    GASKET, DIN EN 1514-1-IBC, NQ,            200          I224625            3
   9    SCREWED CONNECTION, DIN EN ISO            20           I91454             8
  10    SCREWED CONNECTION, DIN EN ISO            20           I91456             8
  11    SCREWED CONNECTION, DIN EN ISO            20           I91455            12
  12    BELLOWS SEAL VALVE, HANDWHEEL, CLIMBING,  200          I372364            1COPY
你数数各个列的宽度,第4楼的宽度非常整齐,如果不整齐,找下原因

TOP

本帖最后由 newswan 于 2021-6-24 11:03 编辑
$pathSour = "."
$fileDest = "11"
[System.Collections.ArrayList] $al = @()
get-childitem -path $pathSour *.rpt | foreach-object {
    $fc = get-content $_
    for ($i = 0 ; $i -le $fc.count ; $i++)
    {
        if ($fc[$i] -match "^\s{2,3}(\d{1,2})(.{46})(.{13})(.{16})(.+)")
        {
            $a = @("") * 6
            $a[0] = $_.basename
            for ($j = 1 ; $j -le 5 ; $j++)
            {
                $a[$j] = $matches[$j].trim()
            }
            $a[5] = $a[5] -replace "\sm",""
            while ($fc[$i+1] -match "^\s{11}\S")
            {
                $a[2] = $a[2] + " " + $fc[$i+1].trim()
                $i += 1
            }
            if (-not ($fc[$i+1] -match "^\s{11}\S"))
            {
                $al.add($a -join "`t") | out-null
            }
        }
    }
}
$al | out-file ($fileDest + ".txt")COPY
你自己数宽度,宽度依次是 4 46 13 16 x

TOP

再来个简单粗暴的
@echo off
findstr /b /r /c:"^  *[0-9]........................................" a.txt > b.txt
pause
1

评分人数

TOP

本帖最后由 jave000 于 2021-6-24 15:43 编辑

回复 39# idwma


@echo off
findstr /b /r /c:"^  *[0-9]........................................" *.prt > b.txt
exit

神仙代码,只是描述没有组合全,只有第一行,而且也没有自动分列,手动分列后有部分错乱,但是很神奇啊……英文句号的个数有含义么?

TOP

本帖最后由 newswan 于 2021-6-24 16:10 编辑
$pathSour = ".\prt"
$fileDest = "11"
[System.Collections.ArrayList] $al1 = @()
[System.Collections.ArrayList] $al2 = @()
get-childitem -path $pathSour "*.prt" | foreach-object {
    $fc = get-content $_.fullname
    for ($i = 0 ; $i -lt $fc.count ; $i++)
    {
        if ($fc[$i] -match "^\s{2}[\s\d]\d\s{4}")
        {
            $al1.add($fc[$i] + "`t" + $_.basename) | out-null
            #$re = '^\s{2,3}(\d{1,2})\s{4}(.+)\s+([^\s]+)\s+([^\s]+)\s+([\d]+[.]?[\d]*\s?M?)$'
            $re = '^\s{2,3}(\d{1,2})(.{46})(.{13})(.{16})(.+)'
            $fc[$i] -match "$re" | out-null
            $a = @("") * 6
            $a[0] = $_.basename
            for ($j = 1 ; $j -le 5 ; $j++)
            {
                $a[$j] = $matches[$j].trim()
            }
            $a[5] = $a[5] -replace "\sm",""
            while ($fc[$i+1] -match "^\s{11}\S")
            {
                $a[2] = $a[2] + " " + $fc[$i+1].trim()
                $i += 1
            }
            if (-not ($fc[$i+1] -match "^\s{11}\S"))
            {
                $al2.add($a -join "`t") | out-null
            }
        }
    }
}
$al1 | out-file ($fileDest + "-1.txt")
$al2 | out-file ($fileDest + "-a.txt")
$v = [string[,]]::new($al2.count,1)
for ($i =0 ; $i -lt $al2.count ; $i++)
{
    $v[$i,0] = $al2[$i]
}
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$Workbook = $Excel.Workbooks.Add()
$Sheet = $Workbook.Worksheets.Item(1)
$rng = "A1:A" +  $al2.count
$Sheet.range($rng).value2 = $v
$colA = $sheet.range("A1").EntireColumn
$colrange = $sheet.range("A1")
$colA.texttocolumns($colrange,1,1,$false,$true,$false,$false,$false) | out-null
$sheet.columns.autofit() | out-null
$Workbook.SaveAs(($PSScriptRoot + "\" + $fileDest))
$excel.Quit()COPY
$re 有两个,还是按列分割比较好。

TOP

$pathSour = ".\prt"
$fileDest = "11"
[System.Collections.ArrayList] $al1 = @()
[System.Collections.ArrayList] $al2 = @()
get-childitem -path $pathSour "*.prt" | foreach-object {
    $fc = get-content $_.fullname
    $nf = $_.basename.ToUpper()
    $nf = $nf -replace "(\w{4})(\w{1,4})?(\w{1,4})?(\w{1,5})?(.*)","`$1-`$2-`$3-`$4-`$5" -replace "-+$",""
    for ($i = 0 ; $i -lt $fc.count ; $i++)
    {
        if ($fc[$i] -match "^\s{2}[\s\d]\d\s{4}")
        {
            $al1.add($fc[$i] + "`t" + $_.basename) | out-null
            #$re = '^\s{2,3}(\d{1,2})\s{4}(.+)\s+([^\s]+)\s+([^\s]+)\s+([\d]+[.]?[\d]*\s?M?)$'
            $re = '^\s{2,3}(\d{1,2})(.{46})(.{13})(.{16})(.+)'
            $fc[$i] -match "$re" | out-null
            $a = @("") * 6
            $a[0] = $nf
            for ($j = 1 ; $j -le 5 ; $j++)
            {
                $a[$j] = $matches[$j].trim()
            }
            $a[5] = $a[5] -replace "\sm",""
            while ($fc[$i+1] -match "^\s{11}\S")
            {
                $a[2] = $a[2] + " " + $fc[$i+1].trim()
                $i += 1
            }
            if (-not ($fc[$i+1] -match "^\s{11}\S"))
            {
                $al2.add($a -join "`t") | out-null
            }
        }
    }
}
$al1 | out-file ($fileDest + "-1.txt")
$al2 | out-file ($fileDest + "-a.txt")
$v = [string[,]]::new($al2.count,1)
for ($i =0 ; $i -lt $al2.count ; $i++)
{
    $v[$i,0] = $al2[$i]
}
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$Workbook = $Excel.Workbooks.Add()
$Sheet = $Workbook.Worksheets.Item(1)
$rng = "A1:A" +  $al2.count
$Sheet.range($rng).value2 = $v
$colA = $sheet.range("A1").EntireColumn
$colrange = $sheet.range("A1")
$colA.texttocolumns($colrange,1,1,$false,$true,$false,$false,$false) | out-null
$sheet.columns.autofit() | out-null
$Workbook.SaveAs(($PSScriptRoot + "\" + $fileDest))
$excel.Quit()COPY
1

评分人数

TOP

回复 42# idwma


    十分感谢,我还在自学中

TOP

本帖最后由 WHY 于 2021-6-25 21:54 编辑
$dir = 'E:\Test\PRT';     #存放prt文件的目录路径
$reg = '(?-i)^\s+(\d+)\s+(.+)(?<!\s)\s+(\d+(?:X\d+)?)\s+(.+)(?<![\sX])\s+(\d+(?:\.\d+)?(?>\s+M)?)$';
$arr = (gc ($dir + '\*.prt')) -match $reg -replace $reg, '"$1","$2","$3","$4","$5"';
sc 1.csv $arr;COPY
用顶楼的附件测试,得到的结果:5列、4600行

TOP

回复 45# WHY


感谢大神,我正在看正则符号争取早日看懂你的代码运行原理。
这里有三个状况,一是描述这一列只显示第一行;二是管道长度的单位“ M”没被删掉;三是没有显示所在文件对应的管号。
我努力学习,尽快做到虽然不会写,但是会改。
十分感谢

TOP

本帖最后由 newswan 于 2021-6-25 23:46 编辑
$pathSour = ".\prt"
$fileDest = "11"
[System.Collections.ArrayList] $al2 = @()
get-childitem -path $pathSour "*.prt" | foreach-object {
    $nf = $_.basename.ToUpper()
    $nf = $nf -replace "(\w{4})(\w{1,4})?(\w{1,4})?(\w{1,5})?(.*)","`$1-`$2-`$3-`$4-`$5" -replace "-+$",""
    $fc = (get-content $_.fullname) -match ''^\s{2,3}\d{1,2}\s{4}.+|^\s{11}\S.+''
    for ($i = 0 ; $i -lt $fc.count ; $i++)
    {
        if ($fc[$i] -match "^\s{2}[\s\d]\d\s{4}")
        {
            #$re = '^\s{2,3}(\d{1,2})\s{4}(.+)\s+([^\s]+)\s+([^\s]+)\s+([\d]+[.]?[\d]*\s?M?)$'
            $re = '^(.{4})(.{46})(.{13})(.{16})(.+)'
            $fc[$i] -match "$re" | out-null
            $a = @("") * 6
            $a[0] = $nf
            for ($j = 1 ; $j -le 5 ; $j++)
            {
                $a[$j] = $matches[$j].trim()
            }
            $a[5] = $a[5] -replace "\sm",""
            while ($fc[$i+1] -match "^\s{11}\S")
            {
                $a[2] = $a[2] + " " + $fc[$i+1].trim()
                $i += 1
            }
            $al2.add($a -join "`t") | out-null
        }
    }
}
$al2 | out-file ($fileDest + ".txt")COPY
1

评分人数

TOP

回复 46# jave000


    "一是描述这一列只显示第一行" 这句是个啥意思?
别的很好改
$fd  = 'E:\Test\PRT';     #存放prt文件的目录路径
$arr = @();
$reg = '(?-i)^\s+(\d+)\s+(.+)(?<!\s)\s+(\d+(?:X\d+)?)\s+(.+)(?<![\sX])\s+(\d+(?:\.\d+)?)(?>\s+M)?$';
forEach( $f In (dir $fd -Filter *.prt) ){
    $s = $f.BaseName;
    $s = $s -replace '^(....)(....)(....)(.....)(.+)$', '$1-$2-$3-$4-$5';
    $arr += @(gc $f.FullName) -match $reg -replace $reg, ('"$1","$2","$3","$4","$5","' + $s + '"');
}
sc 1.csv $arr;COPY
1

评分人数

TOP

返回列表