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
加个sleep试试,之前也遇到过 回复 2# fenhanxue
可是我加上了
FileFlush($file)
呀,应该及时写入到了文件中,怎么还会丢失数据呢? 你是不是多个同时写入一个文件 一行一行的写,首先效率上就有很大的问题.
你可以几百几千行一起写的. 加个记录一共应该写多少行,比较看看。是写漏了还是就不用写。 一般不用怀疑filewrite,象你这种情况,很大可能是IE未完全加载内容造成的 不知道咋回事啊啊 为了保证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)
经反复测试,发现filewrite和filewriteline这两个函数如果频繁进行读写操作,都会出现莫名其妙的错误,改为一百行一写故障解除,咱没发现错误 我写入十多万行的数据没有丢过~ 回复 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]