我目前對PowerShell和編程通常比較陌生。我正在開發PowerShell中的一個工具,它使用兩個CSV文件,每行包含5,000-40,000行和30+標頭。該工具將獲取這兩個文件,並根據關鍵字(符號)查找匹配行並報告相應字段中的差異。Powershell:如何減少兩個陣列的比較時間
的腳本需要兩個參數:要比較兩個CSV文件中。以下代表作爲gcFile1和gcFile2
這些CSV文件將不具有行或全部相同符號的相同的量,但是按字母順序排列。
我能夠匹配基於我所希望的關鍵字符串,執行比較和正確輸出的差異。
我的問題是,它需要完全太長,我的假設是因爲我使用兩個foreach循環到它基本上這個比較對象的每一行,使得它需要比允許更長的時間。
我找了該線路的方式從後續搜索一旦被用來製造更小的陣列,通過每次搜索中移除。
非常感謝你的幫助:)
這裏是包含foreach循環的代碼片段:
#For each line in the first file
ForEach($line1 in $gcFile1)
{
#For Each line in the second file
ForEach($line2 in $gcFile2)
{
#If the symbol from file one is like a symbol from file 2
If($line1.Split(';').Get(0) -like $line2.Split(';').Get(0))
{
$Symbol1 = $line1.Split(';').Get(0)
$Symbol2 = $line2.Split(';').Get(0)
for($x=0;$x -lt $headerCount1; $x++)
{
If($line1.Split(';').Get($x) -like $line2.Split(';').Get($x))
{
$Version1 = $line1.Split(';').Get($x)
$Version2 = $line2.Split(';').Get($x)
} else {
$Version1 = $line1.Split(';').Get($x)
$Version2 = $line2.Split(';').Get($x)
$headerName1 = $headerArray1[$x]
$headerName2 = $headerArray2[$x]
$bufferLength = 30 - $headerName1.Length
$pad = " "
for($y = 0;$y -lt $bufferLength; $y++){
$pad += " "
}
Write-Host "[$headerName1]$pad[$Version1/$Version2]"
Add-Content $logfileBoth "[$headerName1]$pad[$Version1/$Version2]"
}
}
}
}
}
從CSV示例:
Symbol;Validity;AnnualHighDate-Date;AnnualHighDate-Time;AnnualLowDate-Date;AnnualLowDate- Time;AverageVolume100Day;AverageVolume22Day;Beta;ClosePriceMonth;ClosePriceQuarter;ClosePriceWeek;Clo sePriceYear;HighPriceCalendar;LowPriceCalendar;Mo12RateOfReturn;MovingAverage100Day;MovingAverage14Day;MovingAverage200Day;MovingAverage21Day;MovingAverage50Day;MovingAverage9Day;Volatility20Day;Volatility6Month;YTDRateOfReturn;AverageVolume250;HighDateCalendar;Size;AnnualHighDate;AnnualLowDate;CalcLastUpdate
A;valid;20140122;0;20130904;0;1.81273e+006;1.85068e+006;1.3787;57.16;57.44;57.16;57.19;61.22;51.96;0.2481;56.54;57.68;56.59;56.81;56.92;57.67;0.1804;0.1796;0.0198;2320468;20140122;248;1/22/2014;9/4/2013;9/3/2014
AA;valid;20140723;0;20130904;0;1.52891e+007;1.1017e+007;1.5202;16.61;14.89;16.61;10.63;17.22;9.82;1.2085;14.92;16.49;13.02;16.4;16.11;16.59;0.146;0.2494;0.6011;22428276;20140723;248;7/23/2014;9/4/2013;9/3/2014
例如我將在文件1中找到符號A,在符號A中搜索文件2並比較對應於相同頭的列。
期望的結果是用符號和的哪些列是不同的列表的輸出,具有版本1和版本2
樣本輸出:
============================== A ==============================
[Header] [file1.txt/file2.txt]
[AverageVolume100Day] [1.84354e+006/1.81273e+006]
[AverageVolume22Day] [1.85629e+006/1.85068e+006]
[Beta] [1.5311/1.3787]
[Mo12RateOfReturn] [0.2484/0.2481]
[MovingAverage100Day] [56.4635/56.54]
[MovingAverage14Day] [57.455/57.68]
[MovingAverage200Day] [56.5412/56.59]
[MovingAverage21Day] [56.7281/56.81]
[MovingAverage50Day] [56.9214/56.92]
[MovingAverage9Day] [57.7011/57.67]
[Volatility20Day] [0.0508/0.1804]
[Volatility6Month] [0.1285/0.1796]
[YTDRateOfReturn] [0.02/0.0198]
[AverageVolume250] [2325140/2320468]
============================== AA ==============================
[Header] [file1.txt/file2.txt]
[AverageVolume100Day] [1.58983e+007/1.52891e+007]
[AverageVolume22Day] [1.11858e+007/1.1017e+007]
[Beta] [1.6706/1.5202]
[LowPriceCalendar] [9.825/9.82]
[Mo12RateOfReturn] [1.1749/1.2085]
[MovingAverage100Day] [14.8568/14.92]
[MovingAverage14Day] [16.4471/16.49]
[MovingAverage200Day] [12.9426/13.02]
[MovingAverage21Day] [16.3967/16.4]
[MovingAverage50Day] [16.0764/16.11]
[MovingAverage9Day] [16.5478/16.59]
[Volatility20Day] [0.0385/0.146]
[Volatility6Month] [0.178/0.2494]
[YTDRateOfReturn] [0.5767/0.6011]
[AverageVolume250] [22544029/22428276]
具有匹配符號的行是否也與符號外部相同?它是您正在匹配的csv的特定列還是所有列?你可能可以使用'compare-object'來放棄很多。看到csvs的內容將會很有幫助 – 2014-10-07 17:33:10
多久太久了? )無論如何,如果我是你,我會將錶轉儲到數據庫,然後讓數據庫引擎爲我完成這項工作。作爲免費的獎勵,您可以運行任意的SELECT,而無需每次都編寫和調試整個新腳本。 – 2014-10-07 17:42:27
我已經添加了一個CSV示例以及當前代碼的一些示例輸出。一些文件可以在10分鐘內完成,這是可以的。但是其中一些大文件可能需要一個小時或更長時間。 – 2014-10-07 18:07:51