我将 csv 的不同部分分配给数组,特别是每行 2 个,它们不是大值,而是经度/经度,小数点后有 6 个值。有时我可以有一个 500 行的列表,有时它可以有多达 100,000 行。然而,当它超过大约 4,000 时,代码开始变得非常慢。我有一个显示进度的进度条,所以我可以看到它在分配值时呈指数级变慢。这是我的代码:
$aArray1 = FileReadToArray("\miamiedxrequests"&$FileName&"DataGISMeters.csv")
For $i = 2 to Ubound($aArray1)
$line = FileReadLine("\miamiedxrequests"&$FileName&"DataGISMeters.csv", $i)
$row_array = StringSplit($line,",")
$lattitude[$i] = $row_array[Ubound($row_array)-3]
$longitude[$i] = $row_array[Ubound($row_array)-2]
GUICtrlSetData($progress1, ($i/ubound($aArray1))*100)
GUICtrlSetData($Label2,Round(($i/ubound($aArray1))*100,1)&"% Complete")
Next
有谁知道为什么这会变得如此缓慢?也许我每次都在重复不必要的步骤,这会减慢速度。我想不通。提前谢谢。
了巴拿马杰克,我想通了。我只是使用我制作的原始数组,而不是读取每一行。我仍然不知道是什么让它减慢了这么多,但这是修复它的方法:
$i = 2
$aArray1 = FileReadToArray("\miamiedxrequests"&$FileName&"DataGISMeters.csv")
Do
$row_array = StringSplit($aArray1[$i],",")
$lattitude[$i] = $row_array[Ubound($row_array)-3]
$longitude[$i] = $row_array[Ubound($row_array)-2]
GUICtrlSetData($progress1, ($i/ubound($aArray1))*100)
GUICtrlSetData($Label2,Round(($i/ubound($aArray1))*100,1)&"% Complete")
$i = $i + 1
Until $i = Ubound($aArray1)
这就是我会这样做的方式:
#include <file.au3>
$file = "C:Userstestmeters.csv"
Local $aArray
_FileReadToArray($file, $aArray, 1, ",")
_ArrayDisplay($aArray,"Debug")
$lattCol=6 ; adapt to your actual array, obviously
; $lattCol=$aArray[0][1]-3 ; counting from end
$longCol=7
For $i = 1 To $aArray[0][0]
ConsoleWrite($aArray[$i][$lattCol] & " - " & $aArray[$i][$longCol] & @CRLF)
ConsoleWrite("prgress1: " & $i / $aArray[0][0] * 100 & @CRLF)
ConsoleWrite("Label2: " & Round($i / $aArray[0][0] * 100,1) & "% complete" & @CRLF)
Next
主要变化:使用 _FileReadToArray
而不是 FileReadToArray
- 它有更多的选项(例如定义分隔符),使我们能够只使用一个数组。(我没有打扰 GUI 元素 - 应该是微不足道的)