2016-08-19 22 views
0

取代可選列表中的export-csv上的標頭,對於powershell來說相當新穎,我給了自己一些挑戰,我認爲這應該是可能的,但我不確定最佳方式。使用powershell

我們有一個在csv中有大量列的用戶(可以在20-50之間變化),行可以在1到10,000之間變化。數據稱爲客戶名稱,地址1,地址2,郵政編碼等等(雖然這些可以根據數據來源 - 外部公司而變化很大)。這需要使用預先建立的例程來導入到系統中,該例程查看文件和需要數據庫列標題作爲csv標題。所以說ClientDisplay,Ad_Line1,Ad_Line2,PCode等..

我在想一個泛型PowerShell的'映射'形式,可以從ExternalSource.csv讀取頭文件和一個DatabaseHeaders.csv(或直接sql查詢查找)將它們顯示爲表單中的列,然後突出顯示每列和「鏈接」按鈕中的一個,一旦您已經遍歷ExternalSource.csv中的所有列,就會生成一個'generate csv'按鈕,該按鈕將映射的標頭附加正確的數據列從ExternalSource.csv

我吠叫完全試圖使用PowerShell的錯誤樹?目前這是一個非常耗時的過程,所以試圖讓用戶的生活更輕鬆。

讚賞任何意見..

感謝,

喬恩

回答

1

您可以使用Select-Object cmdlet和動態列的數據塑造成你所需要的形式。

喜歡的東西:

Import-Csv -Path 'source.svc' | 
    Select-Object Id, Name, @{ Name='Ad_Line1'; Expression={ $_.Address1 } } | 
    Export-Csv -Path 'target.csv' 

在這個例子中,代碼@{ Name='Ad_Line1'; Expression={ $_.Address1 } }是一個動態的柱,與名AD_Line1' and the value of Address1`創建一個列

它可以從文件中讀取列映射,您將不得不編寫一些代碼來讀取文件,選擇屬性並創建格式。

一個非常簡單的解決方案可能是從另一個腳本文件中讀取Select-Object零件,因此您可以區分每個導入的零件。

A(簡單,幼稚,低高性能)溶液看起來是這樣的(未測試的代碼):

# read input file  
$input = Import-Csv -Path $inputFile 

# read source, target name columns from mapping file 
$mappings = Import-Csv -Path $mappingFile | Select Source, Target 

# apply transformations 
$transformed = $input 
foreach($mapping in $mappings) { 
    # collect the data, add an extra column for each mapping 
    $transformed = $transformed | Select-Object *, @{ Name = $mapping.Target; Expression = { $_.$($mapping.Source) } } 
} 

#export transformed data 
$transformed | Export-Csv -Path $outputFile 

可選擇地;可以使用Import-Csv | Export-CliXml將數據轉換爲XML,在Xml上應用Xslt模板以執行轉換,然後使用Import-CliXml | Export-Csv再次將Xml對象保存到Csv中。關於如何將XSLT與PowerShell一起使用,請參閱this blog by Scott Hansleman

+0

謝謝oɔɯǝɹ,我確實看過,但是ExternalSource.csv列的問題真的會每次都大不相同,所以命中率會很低,因此需要更通用一些。請問Xlst模板如同硬編碼一樣? – user898205

+0

@ user898205您可以使用文件創建解決方案來描述列布局,或者使用xslt來執行映射。在這兩種情況下,代碼將保持不變,因爲每個映射的配置位於config或xslt文件中。具有列映射的解決方案可能更容易配置和使用,但僅限於支持列映射。 xslt解決方案配置起來會更復雜(xslt有點難以使用),但最終會提供更大的靈活性。 –