找回密码
 加入
搜索
查看: 4675|回复: 9

[系统综合] [已解决]正则运用 文本文件的处理汇出 希望给个思路看看该怎么处理 感谢

  [复制链接]
发表于 2012-2-13 13:41:09 | 显示全部楼层 |阅读模式
本帖最后由 kk_lee69 于 2012-2-14 16:29 编辑

小弟有个很多个文本文件  如附件

//-------------------------------------//
// 生效日:880625 0.00.00  ACP2-003.SDD //
//-------------------------------------//
档案代码:ACPTA
文件名:应付凭单单头档
类    型:3 (1.主档单头 2.主档单身 3.交易单头 4.交易单身 5.事务历史记录 6.月檔/统计 7.系统文件 8.其它)
转档完成:Y
PRIMARY :TA001+TA002
INDEX01 :TA003+TA001+TA002
INDEX02 :TA004+TA003
===============================================================================================
序号 字段代号 域名                  TYPE 长度  备注
===============================================================================================
0001 TA001    凭单单别                    C    4   应付凭单单别
0002 TA002    凭单单号                    C   11   应付凭单单号
0003 TA003    凭单日期                    C    8   凭单日期[FORMATE:YMD]
0004 TA004    供应厂商                    C   10   供应厂商代号
0005 TA005    厂别                        C    6   厂别
0006 TA006    统一编号                    C   20   统一编号&&871006del_ta007 //890623 MODI BY 349 C8->C20
0007 TA008    币别                        C    4   币别
0008 TA009    汇率                        N    7.4 汇率

我想把这些文本文件的内容  汇出成 EXCEL 的格式

档案代码  文件名  类型  PRIMARY  INDEX01  INDEX02  序号  字段代号   域名   TYPE  长度   备注

请教高手该怎么处理 可以利用正则抓取到我想要的信息呢??



====================================================================
檔案代碼:(\w+)
檔案名稱:(.+)
類    型:(\d+)
這三個 可以抓到 前面三個資料....... 但是 後面
PRIMARY 跟 INDEX01 的部分  因為有的只有 一個 PRIMARY 有的有三個 PRIMARY 跟 INDEX01 跟 INDEX02
就有點亂七八糟了 呵呵

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-13 14:31:52 | 显示全部楼层
建议先
(?s)码:.+?(?=档案代|$)
分成相同格式的大段,再细分,否则就算匹配出来了也不好整理出属于哪个部分,容易出错
 楼主| 发表于 2012-2-13 22:19:07 | 显示全部楼层
回复 2# afan

好主意.... 呵呵我還在想怎麼紀錄...到底哪個表 是哪些欄位勒....

分成細部的話....應該會比較好處理  我試看看 呵呵
发表于 2012-2-14 01:10:16 | 显示全部楼层
Local $str = FileRead('A1.txt')
Local $sTt = '档案代码|文件名|类型|PRIMARY|INDEX01|INDEX02'
Local $aSS = StringSplit($sTt, '|', 2)
Local $sOut = ''

Local $aSR0 = StringRegExp($str, '(?s)码:.+?(?=档案代|$)', 3)        ;分成相同格式的大段
For $i = 0 To UBound($aSR0) - 1
        $sOut &= '[档案 ' & $i + 1 & ']' & @CRLF
        Local $aSR1 = StringRegExp($aSR0[$i], '(?s).+(?=\v+\=)|.+', 3)        ;再分割两部分
        If UBound($aSR1) < 2 Then ContinueLoop
        Local $aSR2 = StringRegExp($aSR1[0], '(?<!成):(\V+)', 3)        ;提取:部分
        For $ii = 0 To UBound($aSR2) - 1
                $sOut &= $aSS[$ii] & ' = ' & $aSR2[$ii] & @CRLF
        Next
        Local $aSR3 = StringRegExp($aSR1[1], '(\d+)\h+(\w+\d+)\h+(\H+)\h+(\w)\h+(\d+\.?\d*)\h+(\V+)', 3)        ;提取:序号等
        If UBound($aSR3) < 6 Then ContinueLoop
        Local $x = 1
        For $iii = 0 To UBound($aSR3) - 5 Step 6
                $sOut &= $x & '序号 = ' & $aSR3[$iii] & @CRLF
                $sOut &= $x & '字段代号 = ' & $aSR3[$iii + 1] & @CRLF
                $sOut &= $x & '域名 = ' & $aSR3[$iii + 2] & @CRLF
                $sOut &= $x & 'TYPE = ' & $aSR3[$iii + 3] & @CRLF
                $sOut &= $x & '长度 = ' & $aSR3[$iii + 4] & @CRLF
                $sOut &= $x & '备注 = ' & $aSR3[$iii + 5] & @CRLF
                $x += 1
        Next
        $sOut &= @CRLF
Next

Local $sFile = 'testA.ini'
FileDelete($sFile)
FileWrite($sFile, $sOut)
ShellExecute($sFile)

评分

参与人数 1金钱 +10 收起 理由
user3000 + 10 向A大的热心学习也~

查看全部评分

 楼主| 发表于 2012-2-14 15:27:31 | 显示全部楼层
回复 4# afan

果然是 Afan 老大  正則真是太強了.....每次都可以學到東西......
可以請教一下嗎

(?s)碼:.+?(?=檔案代|$)  這段語法裡面的 ?=檔案代|$  意思是 只匹配 檔案代 這幾個字之前或者是結尾  的意思嗎??
发表于 2012-2-14 15:32:56 | 显示全部楼层
(?=檔案代|$) 意思是匹配后面是“檔案代” 或者“末尾”位置的意思
也就是从“碼:”一直到后面是“檔案代” 或者“末尾”位置
 楼主| 发表于 2012-2-14 16:35:08 | 显示全部楼层
回复 6# afan

用意其實都可以了解 重點是 怎麼轉為 正則的語法......
譬如 我寫成  (?s)碼:.+檔案代?

本來的用意是  要以 檔案代  結束  但是跑出來卻不能分成兩個.......而且還多比對了一個 一行叫做檔案的

碼:ACPTB
檔案名稱:應付憑單單身檔
類    型:4 (1.主檔單頭 2.主檔單身 3.交易單頭 4.交易單身 5.交易記錄 6.月檔/統計 7.系統檔 8.其它)
轉檔完成:Y
PRIMARY :TB001+TB002+TB003
INDEX01 :TB005+TB006
===============================================================================================
序號 欄位代號 欄位名稱                  TYPE 長度  備註
===============================================================================================
0001 TB001    憑單單別                    C    4   應付憑單單別
0002 TB002    憑單單號                    C   11   應付憑單單號

~~刪~~

檔案代碼:ACPTC
檔案


果然 還是得多練習  才會變成慣例  才會了解 大概怎樣類型的  要用怎樣的語法才可以是正確的
发表于 2012-2-14 16:53:59 | 显示全部楼层
高手出招果然不一样,学习中
发表于 2012-10-26 17:01:36 | 显示全部楼层
A版的正则功夫真是了不得啊,看了几遍还没看懂。
发表于 2012-12-25 15:05:21 | 显示全部楼层
不懂这东东,学习下了啊谢谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-28 16:18 , Processed in 0.089943 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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