[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 WHY 于 2021-6-25 21:54 编辑
  1. $dir = 'E:\Test\PRT';     #存放prt文件的目录路径
  2. $reg = '(?-i)^\s+(\d+)\s+(.+)(?<!\s)\s+(\d+(?:X\d+)?)\s+(.+)(?<![\sX])\s+(\d+(?:\.\d+)?(?>\s+M)?)$';
  3. $arr = (gc ($dir + '\*.prt')) -match $reg -replace $reg, '"$1","$2","$3","$4","$5"';
  4. sc 1.csv $arr;
复制代码
用顶楼的附件测试,得到的结果:5列、4600行

TOP

回复 42# idwma


    十分感谢,我还在自学中

TOP

  1. $pathSour = ".\prt"
  2. $fileDest = "11"
  3. [System.Collections.ArrayList] $al1 = @()
  4. [System.Collections.ArrayList] $al2 = @()
  5. get-childitem -path $pathSour "*.prt" | foreach-object {
  6.     $fc = get-content $_.fullname
  7.     $nf = $_.basename.ToUpper()
  8.     $nf = $nf -replace "(\w{4})(\w{1,4})?(\w{1,4})?(\w{1,5})?(.*)","`$1-`$2-`$3-`$4-`$5" -replace "-+$",""
  9.     for ($i = 0 ; $i -lt $fc.count ; $i++)
  10.     {
  11.         if ($fc[$i] -match "^\s{2}[\s\d]\d\s{4}")
  12.         {
  13.             $al1.add($fc[$i] + "`t" + $_.basename) | out-null
  14.             #$re = '^\s{2,3}(\d{1,2})\s{4}(.+)\s+([^\s]+)\s+([^\s]+)\s+([\d]+[.]?[\d]*\s?M?)$'
  15.             $re = '^\s{2,3}(\d{1,2})(.{46})(.{13})(.{16})(.+)'
  16.             $fc[$i] -match "$re" | out-null
  17.             $a = @("") * 6
  18.             $a[0] = $nf
  19.             for ($j = 1 ; $j -le 5 ; $j++)
  20.             {
  21.                 $a[$j] = $matches[$j].trim()
  22.             }
  23.             $a[5] = $a[5] -replace "\sm",""
  24.             while ($fc[$i+1] -match "^\s{11}\S")
  25.             {
  26.                 $a[2] = $a[2] + " " + $fc[$i+1].trim()
  27.                 $i += 1
  28.             }
  29.             if (-not ($fc[$i+1] -match "^\s{11}\S"))
  30.             {
  31.                 $al2.add($a -join "`t") | out-null
  32.             }
  33.         }
  34.     }
  35. }
  36. $al1 | out-file ($fileDest + "-1.txt")
  37. $al2 | out-file ($fileDest + "-a.txt")
  38. $v = [string[,]]::new($al2.count,1)
  39. for ($i =0 ; $i -lt $al2.count ; $i++)
  40. {
  41.     $v[$i,0] = $al2[$i]
  42. }
  43. $Excel = New-Object -ComObject Excel.Application
  44. $Excel.Visible = $true
  45. $Workbook = $Excel.Workbooks.Add()
  46. $Sheet = $Workbook.Worksheets.Item(1)
  47. $rng = "A1:A" +  $al2.count
  48. $Sheet.range($rng).value2 = $v
  49. $colA = $sheet.range("A1").EntireColumn
  50. $colrange = $sheet.range("A1")
  51. $colA.texttocolumns($colrange,1,1,$false,$true,$false,$false,$false) | out-null
  52. $sheet.columns.autofit() | out-null
  53. $Workbook.SaveAs(($PSScriptRoot + "\" + $fileDest))
  54. $excel.Quit()
复制代码
1

评分人数

TOP

本帖最后由 newswan 于 2021-6-24 16:10 编辑
  1. $pathSour = ".\prt"
  2. $fileDest = "11"
  3. [System.Collections.ArrayList] $al1 = @()
  4. [System.Collections.ArrayList] $al2 = @()
  5. get-childitem -path $pathSour "*.prt" | foreach-object {
  6.     $fc = get-content $_.fullname
  7.     for ($i = 0 ; $i -lt $fc.count ; $i++)
  8.     {
  9.         if ($fc[$i] -match "^\s{2}[\s\d]\d\s{4}")
  10.         {
  11.             $al1.add($fc[$i] + "`t" + $_.basename) | out-null
  12.             #$re = '^\s{2,3}(\d{1,2})\s{4}(.+)\s+([^\s]+)\s+([^\s]+)\s+([\d]+[.]?[\d]*\s?M?)$'
  13.             $re = '^\s{2,3}(\d{1,2})(.{46})(.{13})(.{16})(.+)'
  14.             $fc[$i] -match "$re" | out-null
  15.             $a = @("") * 6
  16.             $a[0] = $_.basename
  17.             for ($j = 1 ; $j -le 5 ; $j++)
  18.             {
  19.                 $a[$j] = $matches[$j].trim()
  20.             }
  21.             $a[5] = $a[5] -replace "\sm",""
  22.             while ($fc[$i+1] -match "^\s{11}\S")
  23.             {
  24.                 $a[2] = $a[2] + " " + $fc[$i+1].trim()
  25.                 $i += 1
  26.             }
  27.             if (-not ($fc[$i+1] -match "^\s{11}\S"))
  28.             {
  29.                 $al2.add($a -join "`t") | out-null
  30.             }
  31.         }
  32.     }
  33. }
  34. $al1 | out-file ($fileDest + "-1.txt")
  35. $al2 | out-file ($fileDest + "-a.txt")
  36. $v = [string[,]]::new($al2.count,1)
  37. for ($i =0 ; $i -lt $al2.count ; $i++)
  38. {
  39.     $v[$i,0] = $al2[$i]
  40. }
  41. $Excel = New-Object -ComObject Excel.Application
  42. $Excel.Visible = $true
  43. $Workbook = $Excel.Workbooks.Add()
  44. $Sheet = $Workbook.Worksheets.Item(1)
  45. $rng = "A1:A" +  $al2.count
  46. $Sheet.range($rng).value2 = $v
  47. $colA = $sheet.range("A1").EntireColumn
  48. $colrange = $sheet.range("A1")
  49. $colA.texttocolumns($colrange,1,1,$false,$true,$false,$false,$false) | out-null
  50. $sheet.columns.autofit() | out-null
  51. $Workbook.SaveAs(($PSScriptRoot + "\" + $fileDest))
  52. $excel.Quit()
复制代码
$re 有两个,还是按列分割比较好。

TOP

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

回复 39# idwma


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

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

TOP

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

评分人数

TOP

本帖最后由 newswan 于 2021-6-24 11:03 编辑
  1. $pathSour = "."
  2. $fileDest = "11"
  3. [System.Collections.ArrayList] $al = @()
  4. get-childitem -path $pathSour *.rpt | foreach-object {
  5.     $fc = get-content $_
  6.     for ($i = 0 ; $i -le $fc.count ; $i++)
  7.     {
  8.         if ($fc[$i] -match "^\s{2,3}(\d{1,2})(.{46})(.{13})(.{16})(.+)")
  9.         {
  10.             $a = @("") * 6
  11.             $a[0] = $_.basename
  12.             for ($j = 1 ; $j -le 5 ; $j++)
  13.             {
  14.                 $a[$j] = $matches[$j].trim()
  15.             }
  16.             $a[5] = $a[5] -replace "\sm",""
  17.             while ($fc[$i+1] -match "^\s{11}\S")
  18.             {
  19.                 $a[2] = $a[2] + " " + $fc[$i+1].trim()
  20.                 $i += 1
  21.             }
  22.             if (-not ($fc[$i+1] -match "^\s{11}\S"))
  23.             {
  24.                 $al.add($a -join "`t") | out-null
  25.             }
  26.         }
  27.     }
  28. }
  29. $al | out-file ($fileDest + ".txt")
复制代码
你自己数宽度,宽度依次是 4 46 13 16 x

TOP

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

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

回复 33# jave000


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

TOP

回复 33# jave000


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

TOP

回复 32# newswan


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

TOP

回复 35# jave000


    我还在下新的 office 2021版的

TOP

本帖最后由 newswan 于 2021-6-24 00:18 编辑

回复 34# jave000


    我这里正确的,你检查下?
  1. $pathSour = "."
  2. $fileDest = "11"
  3. [System.Collections.ArrayList] $da = @()
  4. get-childitem -path $pathSour *.rpt | foreach-object {
  5.     $fc = get-content $_
  6.     for ($i = 0 ; $i -le $fc.count ; $i++)
  7.     {
  8.         if ($fc[$i] -match "^\s\s\s\d\s|^\s\s\d\d\s")
  9.         {
  10.             $a = @("") * 6
  11.             $a[1] =$fc[$i].substring(0,4).trim()
  12.             $a[2] =$fc[$i].substring(4,46).trim()
  13.             $a[3] =$fc[$i].substring(50,13).trim()
  14.             $a[4] =$fc[$i].substring(63,18).trim()
  15.             $a[5] =$fc[$i].substring(81).trim()
  16.             $a[5] = $a[5] -replace "\sm",""
  17.             while ($fc[$i+1] -match "^\s{11}\S")
  18.             {
  19.                 $a[2] = $a[2] + " " + $fc[$i+1].trim()
  20.                 $i += 1
  21.             }
  22.             if (-not ($fc[$i+1] -match "^\s{11}\S"))
  23.             {
  24.                 $da.add($a -join "`t") | out-null
  25.             }
  26.         }
  27.     }
  28. }
  29. $da | out-file ($fileDest + ".txt")
复制代码
1

评分人数

TOP

回复 33# newswan


    老大你还是早点休息吧,我受之有愧。如果两个空格很难解决,我手改也行的。

TOP

返回列表