2016-05-19 89 views
0

我需要將大文件上傳分成許多並行進程,並希望使用單個CSV文件作爲輸入。 是否有可能從Import-Csv對象訪問行的塊,像這樣:如何訪問Import-Csv陣列中的特定行?

$SODAData = Import-Csv $CSVPath -Delimiter "|" | 
      Where $_.Rownum == 20,000..29,999 | 
      Foreach-Object { ... } 

什麼是這樣一個提取的語法? 我使用PowerShell 5.

回答

1

Import-Csv的文件導入爲對象的數組,所以你可以做這樣的事情(使用範圍運算符):

$csv = Import-CSv $CSVPath -Delimiter '|' 
$SOAData = $csv[20000..29999] | ForEach-Object { ... } 

另一種方法是使用Select-Object

$offset = 20000 
$count = 10000 
$csv = Import-Csv $CSVPath -Delimiter '|' 
$SODAData = $csv | 
      Select-Object -Skip $offset -First $count | 
      ForEach-Object { ... } 

如果你想避免整個文件讀入內存,你可以在上面更改爲單管道:

$offset = 20000 
$count = 10000 
$SODAData = Import-Csv $CSVPath -Delimiter '|' | 
      Select-Object -Skip $offset -First $count | 
      ForEach-Object { ... } 

但是請注意,使用這種方法需要多次讀取文件以處理多個數據塊。

+0

@Barry請記住索引是從零開始的,因此excel中的第2000行是數組中的1999。 :-) –

+0

優秀!完美的作品! Thx @Ansgar –

+0

奇怪的是,@Frode,從$ csv [20..29]中提取的第一行是第22行?在csv文件中有一個標題... –