sdwd_lhq 发表于 2017-3-22 14:02:02

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

本帖最后由 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

fenhanxue 发表于 2017-3-22 14:04:07

加个sleep试试,之前也遇到过

sdwd_lhq 发表于 2017-3-22 14:11:41

回复 2# fenhanxue

可是我加上了
FileFlush($file)
呀,应该及时写入到了文件中,怎么还会丢失数据呢?

zghwelcome 发表于 2017-3-22 17:03:42

你是不是多个同时写入一个文件

Alam 发表于 2017-3-22 18:00:56

一行一行的写,首先效率上就有很大的问题.
你可以几百几千行一起写的.

1361739590 发表于 2017-3-23 08:31:43

加个记录一共应该写多少行,比较看看。是写漏了还是就不用写。

tubaba 发表于 2017-3-23 09:27:34

一般不用怀疑filewrite,象你这种情况,很大可能是IE未完全加载内容造成的

xin266 发表于 2017-3-23 10:21:30

不知道咋回事啊啊

sdwd_lhq 发表于 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], "发票") < 1 Then
                                                                $jiance = 1
                                                        EndIf
                                                Next
                                                If $jiance = 1 Then
                                                        Sleep(200)
                                                        _IELoadWait($oIE)
                                                        ContinueLoop
                                                Else
                                                        ExitLoop
                                                EndIf
                                        WEnd
                                       
                                        web_cj($file, $aTableData)

sdwd_lhq 发表于 2017-3-27 21:32:09

经反复测试,发现filewrite和filewriteline这两个函数如果频繁进行读写操作,都会出现莫名其妙的错误,改为一百行一写故障解除,咱没发现错误

heroxianf 发表于 2017-3-28 11:27:17

我写入十多万行的数据没有丢过~

tubaba 发表于 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
页: [1]
查看完整版本: filewriteline()函数写入文本本件,有时造成文件行内容缺失,什么原因?