kk_lee69 发表于 2012-2-13 13:41:09

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

本帖最后由 kk_lee69 于 2012-2-14 16:29 编辑

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

//-------------------------------------//
// 生效日:880625 0.00.00ACP2-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   凭单日期
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 的格式

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

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



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

afan 发表于 2012-2-13 14:31:52

建议先(?s)码:.+?(?=档案代|$)分成相同格式的大段,再细分,否则就算匹配出来了也不好整理出属于哪个部分,容易出错

kk_lee69 发表于 2012-2-13 22:19:07

回复 2# afan

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

分成細部的話....應該會比較好處理我試看看 呵呵

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, '(?<!成):(\V+)', 3)        ;提取:部分
        For $ii = 0 To UBound($aSR2) - 1
                $sOut &= $aSS[$ii] & ' = ' & $aSR2[$ii] & @CRLF
        Next
        Local $aSR3 = StringRegExp($aSR1, '(\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)

kk_lee69 发表于 2012-2-14 15:27:31

回复 4# afan

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

(?s)碼:.+?(?=檔案代|$)這段語法裡面的 ?=檔案代|$意思是 只匹配 檔案代 這幾個字之前或者是結尾的意思嗎??

afan 发表于 2012-2-14 15:32:56

(?=檔案代|$) 意思是匹配后面是“檔案代” 或者“末尾”位置的意思
也就是从“碼:”一直到后面是“檔案代” 或者“末尾”位置

kk_lee69 发表于 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
檔案


果然 還是得多練習才會變成慣例才會了解 大概怎樣類型的要用怎樣的語法才可以是正確的

lfx99 发表于 2012-2-14 16:53:59

高手出招果然不一样,学习中

sleep365 发表于 2012-10-26 17:01:36

A版的正则功夫真是了不得啊,看了几遍还没看懂。

bsjd120 发表于 2012-12-25 15:05:21

不懂这东东,学习下了啊谢谢
页: [1]
查看完整版本: [已解决]正则运用 文本文件的处理汇出 希望给个思路看看该怎么处理 感谢