找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: jave000

[文本处理] 【已解决】求助批处理提取特定文本并分列

[复制链接]
 楼主| 发表于 2021-6-23 15:48:03 | 显示全部楼层
本帖最后由 jave000 于 2021-6-24 00:27 编辑

回复 18# idwma

CMD窗口闪烁,58kb运行了一分钟,不太好用,不过结果很好
你这个代码我学习一下希望能尽快看懂,十分感谢
 楼主| 发表于 2021-6-23 15:48:52 | 显示全部楼层
回复 17# newswan


    若干*.prt,多个文件的运行结果是一个空白文本文档
发表于 2021-6-23 15:53:10 | 显示全部楼层
回复 23# jave000


    修改路径 $pathsour
 楼主| 发表于 2021-6-23 16:02:17 | 显示全部楼层
回复 20# newswan


    我直接把路径这一行删了,就成功运行了。
但是关于设置空格数量的,无论是刚才的单个文件,还是现在的多个文件,这两段代码,修改空格数量的代码后,运行都是空白
发表于 2021-6-23 16:27:28 | 显示全部楼层
回复 25# jave000

发现有这么一行,2个空格分隔
  1.   12    BELLOWS SEAL VALVE, HANDWHEEL, CLIMBING,  200          I372364            1
复制代码
暂时,解决办法,你先找例外情况,手动修改空格
或者导出的时候,导出为csv格式
找到所有例外情况,看看情况再决定
 楼主| 发表于 2021-6-23 16:40:38 | 显示全部楼层
回复 26# newswan


    $a = $fc[$i].trim() -split "\s{4,}*"
这个代码改成2或3都不行,都是空白,我删了.trim()也是一样的结果
目前这样如果难以解决,也很实用了,我私信你了
我刚看到版规,直接得到结果应该是有偿的
不知应该怎么感谢
发表于 2021-6-23 16:44:46 | 显示全部楼层
  1. $pathSour = "."
  2. $fileDest = "11.txt"

  3. [System.Collections.ArrayList] $da = @()

  4. get-childitem -path $pathSour *.rpt | foreach-object {
  5.     $fc = get-content $_
  6.     $i = 0
  7.     while ($i -le $fc.count)
  8.     {
  9.         if ($fc[$i] -match "^\s\s\s\d\s|^\s\s\d\d\s")
  10.         {
  11.             $a = @("") * 6
  12.             $a[1] =$fc[$i].substring(0,4).trim()
  13.             $a[2] =$fc[$i].substring(4,46).trim()
  14.             $a[3] =$fc[$i].substring(50,13).trim()
  15.             $a[4] =$fc[$i].substring(63,18).trim()
  16.             $a[5] =$fc[$i].substring(81).trim()
  17.             #$a = $fc[$i] -split "\s{2,}"
  18.             #$a[-1] = $a[-1] -replace "\sm",""
  19.             while ($fc[$i+1] -match "^\s{11}\S")
  20.             {
  21.                 $a[2] = $a[2] + " " + $fc[$i+1].trim()
  22.                 $i += 1
  23.             }
  24.             if (-not ($fc[$i+1] -match "^\s{11}\S"))
  25.             {
  26.                 $da.add($a -join "`t") | out-null
  27.             }
  28.         }
  29.         $i += 1
  30.     }
  31. }
  32. $da | out-file $fileDest
复制代码
按长度截取也可以

评分

参与人数 1技术 +1 收起 理由
jave000 + 1 技术大师

查看全部评分

发表于 2021-6-23 21:04:38 | 显示全部楼层
  1. $reg = '(?-i)^\s+\d+\s+.*?(\S+)(?<!X)\s+(\d+(?:\.\d+)?)(?>\s+M)?$';
  2. $arr = (gc *.txt) -match $reg -replace $reg, '$1,$2';
  3. sc 1.csv $arr;
复制代码

评分

参与人数 1技术 +1 收起 理由
jave000 + 1 正则大神

查看全部评分

 楼主| 发表于 2021-6-23 23:45:07 | 显示全部楼层
本帖最后由 jave000 于 2021-6-23 23:52 编辑

回复 29# WHY


    你的代码好少啊……但是确实能生成两列,好强,它还能修改成显示五列吗?
发表于 2021-6-23 23:52:33 | 显示全部楼层
本帖最后由 newswan 于 2021-6-24 00:00 编辑

  1. $Excel = New-Object -ComObject Excel.Application
  2. $Excel.Visible = $true
  3. $Workbook = $Excel.Workbooks.Add()
  4. $Sheet = $Workbook.Worksheets.Item(1)
  5. for ($i =1 ; $i -le $da.count ; $i++)
  6. {
  7.     $Sheet.cells($i,1).value = $da[$i-1]
  8. }
  9. $colA=$sheet.range("A1").EntireColumn
  10. $colrange=$sheet.range("A1")
  11. $colA.texttocolumns($colrange,1,1,$true,$true,$false,$false,$false)
  12. $sheet.columns.autofit()
  13. $Workbook.SaveAs(($PSScriptRoot + "" + $fileDest))
  14. $excel.Quit()
复制代码
生成 excel 文件 加到后面

评分

参与人数 1技术 +1 收起 理由
jave000 + 1 细致

查看全部评分

发表于 2021-6-23 23:54:09 | 显示全部楼层
只需要保留 2 4 5 ?
 楼主| 发表于 2021-6-23 23:55:26 | 显示全部楼层
本帖最后由 jave000 于 2021-6-23 23:59 编辑

回复 32# newswan

出现了这样的连续报错,运行速度也很慢,但也出了结果,只不过结果文件特别大,200KB的若干PRT文件,生成了一个4MB多的txt文件

    无法对 Null 数组进行索引。
所在位置 行:11 字符: 13
+         if ($fc[$i] -match "^\s\s\s\d\s|^\s\s\d\d\s")
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: ( [],RuntimeException
    + FullyQualifiedErrorId : NullArray

无法对 Null 数组进行索引。
所在位置 行:11 字符: 13
+         if ($fc[$i] -match "^\s\s\s\d\s|^\s\s\d\d\s")
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [],RuntimeException
    + FullyQualifiedErrorId : NullArray

无法对 Null 数组进行索引。
所在位置 行:11 字符: 13
+         if ($fc[$i] -match "^\s\s\s\d\s|^\s\s\d\d\s")
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [],RuntimeException
    + FullyQualifiedErrorId : NullArray

无法对 Null 数组进行索引。
所在位置 行:11 字符: 13
+         if ($fc[$i] -match "^\s\s\s\d\s|^\s\s\d\d\s")
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [],RuntimeException
    + FullyQualifiedErrorId : NullArray
 楼主| 发表于 2021-6-23 23:57:19 | 显示全部楼层
回复 33# newswan


    老大你还是早点休息吧,我受之有愧。如果两个空格很难解决,我手改也行的。
发表于 2021-6-23 23:59:49 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
jave000 + 1 乐于助人

查看全部评分

发表于 2021-6-24 00:06:24 | 显示全部楼层
回复 35# jave000


    我还在下新的 office 2021版的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 18:49 , Processed in 0.033374 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表