2016-08-25 2 views
1

Начиная с 500 000 строк CSV, мне нужно разделить файлы на день и час (второй и третий столбцы). Я попробовал изменить группу, чтобы включить этот час, и пока я вижу, как час добавляется к моему имени файла, я не получаю никаких результатов в экспортированном файле.Разбиение CSV-файла на два столбца

Еогеасп делает работу:

foreach ($group in $data | Group Day,hour) { 
    $data | Where-Object { $_.Day -and $_.Hour -eq $group.Name } 
    ConvertTo-Csv -NoTypeInformation | 
    foreach {$_.Replace('"','')} | 
    Out-File "$Path\Testfile_$($group.name -replace $regexA, '').csv" 

Образец данных:

Bob,1/27/2012,8:00,Basic,Operations 
Charlie,2/3/2012,9:00,Advanced,Production 
Bill,3/7/2012,10:00,Advanced,Production
+0

'$ данные | Where-Object {$ _. Day-and $ _. Hour -eq $ group.Name} '->' $ _. Group' содержит все вещи в группе, не нужно пересканировать все 500 000 вещей, чтобы попытаться составить группа снова. '$ _. Day-and $ _. Hour' не делает то, что вы думаете, это логический оператор и возвращает' $ True', который никогда не будет соответствовать имени группы. – TessellatingHeckler

ответ

3

Вы можете импортировать CSV, определить имя выходного файла на лету, и добавить каждую запись в файл matchning:

Import-Csv 'C:\path\to\input.csv' | ForEach-Object { 
    $filename = ('output_{0}_{1}.csv' -f $_.Day, $_.Hour) -replace '[/:]' 
    $_ | Export-Csv "C:\path\to\$filename" -Append -NoType 
} 

Обратите внимание, что Export-Csv -Append требует PowerShell v3 или более поздней версии.

+0

Спасибо, я дам этот метод попробовать, когда я могу перезагрузиться, чтобы установить PSv3 – jjamesjohnson

+0

В более ранних версиях вы могли бы использовать что-то вроде '$ _ | ConvertTo-Csv -NoType | Select-Object -Skip 1 | Надстройка Content'. Менее элегантный (и вы потеряете заголовок), но должен работать. –

+0

Спасибо, я отметил это как ответ, так как он сделал именно то, что мне было нужно. – jjamesjohnson

Смежные вопросы