本帖最后由 xy506 于 2018-8-29 19:25 编辑
一、需求起因:手上有大量CAD图纸、图纸文件内包含不定量工程项目的图纸。现需要整理出每个图纸文件中包含有哪些工程项目。
示例图纸包:链接: https://pan.baidu.com/s/1mIsue6Ek-GhwaKhNVMVpAg 密码: cri3
二、解决思路:
1、先通过AcmeCADConverter_Por软件将DWG格式的图纸转换为DXF文件,并将DXF文件绝对路径导出至:文件列表.txt。
AcmeCADConverter_Por下载地址:2、然后通过批处理将DXF文件作为文本文档处理,提取出包含“工程”、“图”的文本行并另存为以DXF图纸文件名命名的TXT文档内。批处理代码如下:- @echo off & setlocal EnableDelayedExpansion
- set j=0
- for /f "delims=" %%i in (文件列表.txt) do (
- set /a j+=1
- set con!j!=%%i
- call set a=%%con!j!%%
- type !a! | find "工程" >> "!a!.txt"
- type !a! | find "图" >> "!a!.txt"
- @echo off
- )
复制代码 3、通过批处理将以DXF图纸文件名命名的TXT文档内重复的行、不符合要求的行删除并不保留空行。
去除重复行功能谢谢管理员在三楼给出的代码试用后成功处理了重复行代码:- @echo off
- md "去重之后的文件"
- for /f "delims=" %%i in ('dir /b /s *.txt') do (
- echo 正在处理文件 %%i
- setlocal
- (for /f "delims=" %%a in ('type "%%i"') do (
- if not defined _%%a (
- echo,%%a
- set "_%%a=1"
- )
- ))>"去重之后的文件\%%~ni.log"
- endlocal
- )
复制代码 现在还差去除不需要的数据了。
去除不需要的数据,个人想法:
3.1、删除每一行内多余的空格,
3.2、删除少于6个汉子内容的行,
3.3、删除"数据链接^"、"C:\或者D:\等盘符地址"开头的行
3.4、提取:“((FRAME .”开头的行中(PLOTFILEPREFIX . "******(工程名称)******_")这一段""双引号内的内容其余部分删除
4、将整理好的文本文档处理为电子表格,第一列为文件名,后面依次填写文件内包含的工程名称。
三、遇到的问题:1、在处理TXT文档内重复的行、不符合要求的行删除并不保留空行时,单个文档可以处理,但是用变量批处理就不行了。
单个处理代码如下- @echo off
- (for /f "delims=" %%i in (XXX.txt) do findstr "%%i" "XXX2.txt">nul||echo %%i)>XXX2.txt
- )
- pause
复制代码 2、如何按条件删除不符合条件的行的代码也不会写。
3、如何将大量TXT文档处理成电子表格也暂时没想到解决办法。
谢谢论坛里的大神~~问题解决了~附上最终代码:- $start = Get-Date #记录脚本开始执行时间
- ForEach( $file In (dir "*.dxf") ) { #这里加了双引号,不加双引号的时候会出现找不到路径报错
- $arr = [IO.File]::ReadAllLines($file, [Text.Encoding]::Default);
- $arr = $arr -match '工程|图' -replace '\s+'; #匹配包含"工程" 或 "图"的行、删除空格
- $arr = $arr -replace '^\(\(FRAME.*PLOTFILEPREFIX."([^"]+)".*$', '$1';
- $arr = $arr -NotMatch '^.{1,5}$|数据链接\^|[c-zC-Z]:\\|"TCH_KERNAL|接图|图例|在选择|说明|关闭|宋体' #删除不符合要求的行
- $arr = $arr | sort -Unique; #删除重复行
- $str += '"' + $file.Name + '","' + ($arr -join '","') + '"' + "`r`n";
- }
- #Get-ChildItem variable: #显示出变量的值以便查看问题出现在哪里
- sc a.CSV -Value $str;
- $end = Get-Date #记录脚本结束执行时间
- Write-Host -ForegroundColor Red ('Total Runtime: ' + ($end - $start).TotalSeconds) #显示脚本执行时间
复制代码
|