找回密码
 加入
搜索
查看: 8639|回复: 28

[AU3基础] [已解]文本處理--將1文本的特定內容插到另文本指定位置中.

 火.. [复制链接]
发表于 2013-1-31 10:58:18 | 显示全部楼层 |阅读模式
本帖最后由 wenquan79 于 2013-2-18 20:00 编辑

請教怎樣將文本1第3欄的內容從文本2中找到對對應的行并將其對應內容導入文本1,
即想處理成文本3,謝謝!

--------文本1--------------------
─        59YV03W0-VG0A01S        07G003000120        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000110        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000213        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000310        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000510        FQ1,PQ10,PQ11,PQ3
─        59YV03W0-VG0A01S        07G003001120        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001110        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001211        FQ2,FQ3

----文本2----
07G003000120        05C111-163004
07G003000110        05C111-163005
07G003000213        05C111-163011
07G003000310        05C111-163012
07G003000510        05C111-163013
07G003001120        05C111-163014
07G003001110        05C111-163015
07G003001211        05C111-163016

-------文本3------
─        59YV03W0-VG0A01S        07G003000120        05C111-163004        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000110        05C111-163005        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000213        05C111-163011        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000310        05C111-163012        FQ1,PQ10,PQ11,PQ3
S:        59YV03W0-VG0A01S        07G003000510        05C111-163013        FQ1,PQ10,PQ11,PQ3
─        59YV03W0-VG0A01S        07G003001120        05C111-163014        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001110        05C111-163015        FQ2,FQ3
S:        59YV03W0-VG0A01S        07G003001211        05C111-163016        FQ2,FQ3
发表于 2013-1-31 12:01:06 | 显示全部楼层
回复 1# wenquan79

如果文本1中每行的第三部分与文本2对应行的第一部分总是相同的话,直接将文本进行按行拆分,然后接接即可,如果不一定相同,需要比较一下,直到匹配到相同的,再拼接~
 楼主| 发表于 2013-1-31 13:47:49 | 显示全部楼层
回Annybaby兄,文本1第3部分与文本2的第1部分不是完全一样的,文本2的内容很多,就像数据库一样,但文本1第3栏的内容都能在文本2里找到。
发表于 2013-1-31 14:58:45 | 显示全部楼层
Local $str1 = FileRead('1.txt')
Local $str2 = FileRead('2.txt')

Local $aSR2 = StringRegExp($str2, '(\S+)\h+(\S+)', 3)
If @Error Then Exit
For $i = 0 To UBound($aSR2) - 1 Step 2
        Assign('~' & $aSR2[$i], $aSR2[$i + 1])
Next
Opt('ExpandVarStrings', 1)
$str1 = StringRegExpReplace($str1, '(?:\S+\h+\S+\h+)(\S+)', '$0        $~$1$')
Local $FO = FileOpen('3.txt', 2 + 8)
FileWrite($FO, $str1)
FileClose($FO)
 楼主| 发表于 2013-1-31 16:13:13 | 显示全部楼层
回复 4# afan
感謝Afan兄的代碼,經測試能完美解決,我原使用數組及StringReplace,那速度慢得很,可否幫忙講解一下你的代碼,感謝!

我原來的思路是先將文本1的第3欄分解成1C1.txt, 由1C1.txtr 每行去文本2中找到再寫回文本1,這太慢了。
#include<file.au3>
#include<array.au3>
Dim $_file1=@ScriptDir & "\1c1.txt",$_file2=@ScriptDir & "\1.txt",$_file3=@ScriptDir & "\2.txt",$_file4=@ScriptDir & "\datano.txt",$aRecords1,$aRecords2,$aRecords3
_FileReadToArray($_file1,$aRecords1)
_FileReadToArray($_file2,$aRecords2)
_FileReadToArray($_file3,$aRecords3)
For $x=1 To $aRecords1[0]
        $_index=0
                $_index1=0
        If $aRecords1[$x] = "" Then ContinueLoop
        $_index=_ArraySearch($aRecords3, $aRecords1[$x],0,0,0,1)
        If $_index=-1 Then 
                FileWriteLine($_file4,$aRecords1[$x])
                                
                Else
                $_index1=_ArraySearch($aRecords2, $aRecords1[$x],0,0,0,1)        
                $aRecords2[$_index1]=StringReplace($aRecords2[$_index1],$aRecords1[$x],$aRecords3[$_index])
                        
                EndIf 
                Next
        _FileWriteFromArray($_file2, $aRecords2,1)
发表于 2013-1-31 16:41:46 | 显示全部楼层
回复 5# wenquan79


    首先循环在数组中搜索是比较耗时的,再循环在未FileOpen文件的情况下写入也是非常耗时的。

我在楼上的代码是先用Assign()将之前正则捕获到的数据一一对应的声明赋值一遍,然后一次性正则替换所有数据,所以效率是极高的。至于正则的解释不太好说,只能靠自己理解了。
 楼主| 发表于 2013-1-31 17:05:16 | 显示全部楼层
了解,感谢!
发表于 2013-1-31 17:50:54 | 显示全部楼层
先把2存成数据库,直接到文本1中截出所根据的文本到数据库里找
发表于 2013-1-31 19:24:23 | 显示全部楼层
回复 4# afan
    超版 ,    Assign('~' & $aSR2[$i], $aSR2[$i + 1])中'~'是什么含义?
发表于 2013-1-31 19:27:29 | 显示全部楼层
回复 9# whitehead


    以免和正常申明变量冲突(带~字符是不能正常申明变量的)
 楼主| 发表于 2013-2-1 11:06:20 | 显示全部楼层
回复 6# afan
afan 兄,你好! 正表達式太強了,可也太深了,我弄不明白。
再請教一下,可否增加一個功能,如文本1中有,但文本2中沒找到,將其值(文本1第3爛值)寫到文本4,謝謝!
发表于 2013-2-1 11:23:37 | 显示全部楼层
回复 11# wenquan79


    后面加5行
Local $str4 = StringRegExpReplace($str1, '(?s).+?(\S+)\h+\$~.+?\$\h+.+?', '$1______')
$str4 = StringRegExpReplace($str4, '(?s)______[^_]+$', '')
$str4 = StringRegExpReplace($str4, '______', @CRLF)
$FO = FileOpen('4.txt', 2 + 8)
FileWrite($FO, $str4)
FileClose($FO)
 楼主| 发表于 2013-2-1 11:48:28 | 显示全部楼层
回复 12# afan
afan 兄,你好,加上后面這段后,經測試程式一直跑不完,幫忙看一下,謝謝!
发表于 2013-2-1 11:52:16 | 显示全部楼层
回复  afan
afan 兄,你好,加上后面這段后,經測試程式一直跑不完,幫忙看一下,謝謝!
wenquan79 发表于 2013-2-1 11:48



    不会吧,我这只要10毫秒就跑完了。。。
Local $str1 = FileRead('1.txt')
Local $str2 = FileRead('2.txt')

Local $aSR2 = StringRegExp($str2, '(\S+)\h+(\S+)', 3)
If @Error Then Exit
For $i = 0 To UBound($aSR2) - 1 Step 2
        Assign('~' & $aSR2[$i], $aSR2[$i + 1])
Next
Opt('ExpandVarStrings', 1)
$str1 = StringRegExpReplace($str1, '(?:\S+\h+\S+\h+)(\S+)', '$0        $~$1$')
Local $FO = FileOpen('3.txt', 2 + 8)
FileWrite($FO, $str1)
FileClose($FO)

Local $str4 = StringRegExpReplace($str1, '(?s).+?(\S+)\h+\$~.+?\$\h+.+?', '$1______')
$str4 = StringRegExpReplace($str4, '(?s)______[^_]+$', '')
$str4 = StringRegExpReplace($str4, '______', @CRLF)
$FO = FileOpen('4.txt', 2 + 8)
FileWrite($FO, $str4)
FileClose($FO)
 楼主| 发表于 2013-2-1 14:01:49 | 显示全部楼层
回复 14# afan
afan 兄:你好!此代碼試還是一樣,同樣是運行后完成不了,卡在下面的地方就不動了。我使用的版本是V3.3.0.0,謝謝!

+>13:59:07 AU3Check ЧΘ[CODE]:0
>?︽:(3.3.9.4):D:\autoit3\autoit3.exe "D:\autoit3\new\bb.au3"
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 06:26 , Processed in 0.082786 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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