2013-10-24 2 views
0

У меня есть CSV с разделителями табуляции, которые нужно разбить на отдельные CSV для каждой строки, причем имя файла [FirstName] [LastName] .csv.PowerShell: экспортируйте каждую строку CSV в отдельный файл

Кроме того, мне нужно манипулировать некоторыми данными, в частности удалять тире из SSN.

Образец Содержание

FirstName LastName SSN 
========= ========= ====== 
Albert  Abernathy 111-11-1111 
Billy  Barty  222-22-2222 
Chris  Canton  333-33-3333 

Желаемая выход (Filename | CSV Content)

Albert Abernathy.csv | Albert  Abernathy 111111111 
Billy Barty.csv  | Billy  Barty  222222222 
Chris Canton.csv  | Chris  Canton  333333333 

Вот что я до сих пор.

$csvFile = "C:\Test\List.csv" 
$folderPath = Split-Path -Parent $csvFile 
$csv = Import-Csv -Path $csvFile -Delimiter "`t" 
| Where-Object {$_.LastName -ne ""} ##Prevent importing blank lines 
| Foreach-Object {$_.SSN -Replace "-","" } ##Remove dashes from SSN 
foreach ($line in $csv) 
{ $saveName = $line.FirstName + " " + $line.LastName + ".csv" 
    Export-Csv -Delimiter "`t" -Path $folderPath\$saveName 
} 

До сих пор все это выполнялось, но оно просто приостанавливается после заключительной статьи и ничего не происходит. Как я мощеную это вместе с поиска Google, я уверен, мой синтаксис нужно работать, так что я был бы признателен, если кто-то может мне точку в правильном направлении

--Update--

Кредит на alroc для указания меня в правильном направлении и mjolinor для предоставления неоценимого синтаксиса REPLACE, который я больше не мог найти. Вот мой окончательный сценарий.

$csvFile = "C:\Test\List.csv" 
$folderPath = Split-Path -Parent $csvFile 

### filter out blank records and delete dashes from SSN ### 
(Get-Content $csvFile | 
    Select-Object | 
    Where-Object {$_.LastName -ne ""}) | #Rows with non-blank last name 
    Foreach-Object {$_ -Replace '(\d{3})-(\d{2})-(\d{4})','$1$2$3'} | 
    Set-Content $csvFile 

### import csv data and export file for each row ### 
$csv = Import-Csv -Path $csvFile -Delimiter "`t" 
foreach ($row in $csv) { 
    $outPath = Join-Path -Path $folderPath -ChildPath $($row.FirstName + " " + $row.LastName + ".csv"); 
    $row | Select-Object | 
     ConvertTo-Csv -NoTypeInformation -Delimiter "`t" | 
     Foreach-Object {$_.Replace('"','')} | #Delete quotes around each "cell" 
     Out-File $outPath 
    (Get-Content $outPath | 
     Select-Object -Skip 1) | #Delete header 
     Set-Content $outPath 
} 

ответ

1

Я не совсем уверен, что вы имеете в виду под «он просто делает паузу после окончательного пункта и ничего не происходит», но он может иметь что-то делать с вами обжигающе import-csv к остальной части процесса и попытки назначить результат - $csv. Это работает для меня:

$csvFile = "C:\Test\List.csv" 
$folderPath = Split-Path -Parent $csvFile 
$csv = Import-Csv -Path $csvFile -Delimiter "`t" 
foreach ($record in $csv) { 
    $OutFileName = join-path -Path $folderPath -ChildPath $($record.FirstName + " " + $record.LastName + ".csv"); 
    $record|select-object FirstName,LastName,@{name="SSN";expression={$_.SSN -replace "-",""}}|export-csv -NoTypeInformation -Path $OutFileName -Delimiter "`t"; 
} 

Или, если вы хотите сделать это без промежуточных переменных, сохраняя его больше трубопроводную-у:

$csvFile = "C:\Test\List.csv" 
$folderPath = Split-Path -Parent $csvFile 
Import-Csv -Path $csvFile -Delimiter "`t" | foreach { 
    $OutFileName = join-path -Path $folderPath -ChildPath $($_.FirstName + " " + $_.LastName + "2.csv"); 
    $_|select-object FirstName,LastName,@{name="SSN";expression={$_.SSN -replace "-",""}}|export-csv -NoTypeInformation -Path $OutFileName -Delimiter "`t"; 
} 
+0

Оба они работали как рекламируемые. Любой способ избежать указания каждого столбца на выходе? Фактический сценарий имеет около 60 столбцов. – Matt

+0

Используя ConvertTo-CSV, Out-File и Replace, зажатые между ними, я смог вывести файл без кавычек. http://social.technet.microsoft.com/Forums/windowsserver/en-US/f6b610b6-bfb2-4140-9529-e61ad30b8927/how-to-export-csv-without-doublequote?forum=winserverpowershell – Matt

+1

($ record | select-object ConvertTo-Csv -NoTypeInformation -Delimiter "' t ") [1] .replace ('"', '') -replace '(\ d {3}) - (\ d {2}) - (\ d {4}) ',' $ 1 $ 2 $ 3 '| Out-File $ OutFileName – mjolinor

0

FWIW - Не тестировался. Сохраняли как можно больше оригинального сценария.

$csvFile = "C:\Test\List.csv" 
$folderPath = Split-Path -Parent $csvFile.fullname 

Import-Csv -Path $csvFile -Delimiter "`t" | 
Where-Object {$_.LastName -ne ""} | ##Prevent importing blank lines 
Foreach-Object { 
    $_.SSN = $_.SSN -Replace "-","" ##Remove dashes from SSN 
    $saveName = $_.FirstName + " " + $_.LastName + ".csv" 
    Export-Csv $_ -Delimiter "`t" -Path $folderPath\$saveName 
    } 
+0

Для этого я получаю следующее приглашение PS: cmdlet Export -Csv в позиции командного конвейера 1 Значения для следующих параметров: InputObject: – Matt

+0

Добавлен $ _ для использования текущего объекта конвейера в качестве объекта InputObject для экспорта. – mjolinor

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