2016-05-19 6 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 Помните, что индексы основаны на нуле, поэтому строка 2000 в excel равна 1999 в массиве. :-) –

+0

Отлично! Работает отлично! Thx @Ansgar –

+0

Странно, однако, @Frode, первая строка, которая была извлечена из $ csv [20..29], была строка 22? В файле csv был заголовок ... –