找回密码
 加入
搜索
查看: 3760|回复: 11

[IE类操作] filewriteline()函数写入文本本件,有时造成文件行内容缺失,什么原因?

  [复制链接]
发表于 2017-3-22 14:02:02 | 显示全部楼层 |阅读模式
本帖最后由 sdwd_lhq 于 2017-3-24 08:57 编辑

循环打开一个网页数据集,一页一页的翻,将里面的<table></table>中的数据读取到一个数组中,然后将数据循环通过filewriteline()函数写入ZPCG.CSV文件中,这个过程很长有时要有几万条记录,发现写入到csv文件中的数据经常发生缺失,不是少头部分,就是缺行尾部分,不知是什么愿因?
Local $file = FileOpen(@ScriptDir & "\ZPCG.CSV", 2)
$oTable = _IETableGetCollection($oIE, 16)
$aTableData = _IETableWriteToArray($oTable, True)
web_cj($file, $aTableData)

Func web_cj($file, $aTableData)
        Dim $hang, $col, $i, $line_string
        $hang = UBound($aTableData, 1)
        $col = UBound($aTableData, 2)
        $col_end = $col - 2
        For $i = 2 To $hang - 2
                $line_string = ""
                For $lie = 0 To $col_end
                        $nr = StringStripWS($aTableData[$i][$lie], 3)
                        Switch $lie
                                Case 0
                                        $line_string = '"' & $nr & '",'
                                Case $col_end
                                        $line_string = $line_string & '"' & $nr & '"'
                                Case Else
                                        $line_string = $line_string & '"' & $nr & '",'
                        EndSwitch
                Next
                FileWriteLine($file, $line_string)
                FileFlush($file)
        Next
EndFunc   ;==>web_cj
发表于 2017-3-22 14:04:07 | 显示全部楼层
加个sleep试试,之前也遇到过
 楼主| 发表于 2017-3-22 14:11:41 | 显示全部楼层
回复 2# fenhanxue

可是我加上了
FileFlush($file)
呀,应该及时写入到了文件中,怎么还会丢失数据呢?
发表于 2017-3-22 17:03:42 | 显示全部楼层
你是不是多个同时写入一个文件
发表于 2017-3-22 18:00:56 | 显示全部楼层
一行一行的写,首先效率上就有很大的问题.
你可以几百几千行一起写的.
发表于 2017-3-23 08:31:43 | 显示全部楼层
加个记录一共应该写多少行,比较看看。是写漏了还是就不用写。
发表于 2017-3-23 09:27:34 | 显示全部楼层
一般不用怀疑filewrite,象你这种情况,很大可能是IE未完全加载内容造成的
发表于 2017-3-23 10:21:30 | 显示全部楼层
不知道咋回事啊啊
 楼主| 发表于 2017-3-24 08:46:17 | 显示全部楼层
为了保证ie加载table完整,我在程序中增加了检测代码,否则就继续等待,比如table第一列的内容均含有汉字”发票“字样,所以检查第一列内容是否包含发票汉字,如果存在则继续程序执行进行filewriteline(),否则就继续网页加载等待,单仍然出现行数据丢失的情况,奈何???
                                        $jiance = 0
                                        While 1
                                                $oTable = _IETableGetCollection($oIE, 16)
                                                $aTableData = _IETableWriteToArray($oTable, True)
                                                $hang = 0
                                                $hang = UBound($aTableData, 1)
                                                For $i = 2 To $hang - 2
                                                        If StringInStr($aTableData[$i][0], "发票") < 1 Then
                                                                $jiance = 1
                                                        EndIf
                                                Next
                                                If $jiance = 1 Then
                                                        Sleep(200)
                                                        _IELoadWait($oIE)
                                                        ContinueLoop
                                                Else
                                                        ExitLoop
                                                EndIf
                                        WEnd
                                        
                                        web_cj($file, $aTableData)
 楼主| 发表于 2017-3-27 21:32:09 | 显示全部楼层
经反复测试,发现filewrite和filewriteline这两个函数如果频繁进行读写操作,都会出现莫名其妙的错误,改为一百行一写故障解除,咱没发现错误
发表于 2017-3-28 11:27:17 | 显示全部楼层
我写入十多万行的数据没有丢过~
发表于 2017-3-28 12:47:05 | 显示全部楼层
回复 10# sdwd_lhq


    既然这样,那就写之前打开文件句柄,写好关闭
Local $file
$oTable = _IETableGetCollection($oIE, 16)
$aTableData = _IETableWriteToArray($oTable, True)
web_cj($file, $aTableData)

Func web_cj($file, $aTableData)
        Dim $hang, $col, $i, $line_string
        $hang = UBound($aTableData, 1)
        $col = UBound($aTableData, 2)
        $col_end = $col - 2
        For $i = 2 To $hang - 2
                $line_string = ""
                For $lie = 0 To $col_end
                        $nr = StringStripWS($aTableData[$i][$lie], 3)
                        Switch $lie
                                Case 0
                                        $line_string = '"' & $nr & '",'
                                Case $col_end
                                        $line_string = $line_string & '"' & $nr & '"'
                                Case Else
                                        $line_string = $line_string & '"' & $nr & '",'
                        EndSwitch
                Next
              $file= FileOpen(@ScriptDir & "\ZPCG.CSV", 2)
                FileWriteLine($file, $line_string)
                Fileclose($file)
        Next
EndFunc   ;==>web_cj
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-18 11:12 , Processed in 0.080779 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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