2016-11-04 6 views
1

私は同様の質問hereを尋ねましたが、それは非常に良いトラックで私をつかまえましたが、「一人で」しようとしているうちに問題が発生しました。私は非常に近いですが、多くの理論をテストした後、私は必要なものを取り返そうとしています。マージ後にCSVがエクスポートされない

私は、複数のシートExcelを持っている - 。私は、最初のシートを引き出し、それをCSV-IFY、その後、ヘッダを削除し、その後、最初の行だけから最初の3桁の数字を取得します(「リスト名」)する必要が

私のPSは以下のとおりです。私はそれをたくさん修正、およびスケジュール複数のBATを避けるために、それは、単一の実行可能にするために試してみた

#Create and get my Excel Obj 
$excel = New-Object -comobject Excel.Application 
$excel.visible=$false 
$excel.DisplayAlerts=$false 
$UserWorkBook = $excel.Workbooks.Open("C:\path\to\file\CompleteTest.xls") 

$UserWorksheet = $UserWorkBook.Worksheets.Item(1) 

$hitlistCSV = "C:\path\to\file\BroadcastReport.csv" 
$xlCSV = 6 #changed-grav 

#Save, close, and clean up 
$UserWorksheet.SaveAs($hitlistCSV,$xlCSV) 
$UserWorkBook.close() 
$excel.quit() 
$excel = $null 


$expandfile = "C:\path\to\file\BroadcastReport.csv" 
(gc $expandfile | select -Skip 1) | sc $expandfile 
Import-Csv $expandfile | ForEach-Object { 
    $_."List Name" = $_."List Name".SubString(0,3) 
    $_ 
} 
$expandfile | Export-Csv "C:\path\to\file\BroadcastReport.csv" -NoTypeInformation 

。すべてがうまくいくようです - 最初のシートを引っ張って名前を変更し、2番目の部分を実行するたびにトップラインを置き換えます。ただし、SubString部分は有効ではなく、「FileExport」ファイルも取得されません。

私の最後の変更は、入力オブジェクトを提供する必要があると応答するたびに機能するようになっているように思います。参考までに、分割する必要がある行はカンマが付いているため二重引用符で囲まれています。例:

"123|ST,City" 

私は123が必要です。ファイルをインポートして、私のForEach機能を実行すると、出力は私の期待通りです。ファイルに保存するだけではありません。

ありがとうございました。

すべての入力を歓迎します。 XLS後

XLSソース

This is the header line I need to skip             
List Name Broadcast Name ColumC ColumD Colum E ColumF Colum G ColumJ      
401|ST, City ST, City - More Text(LSM) (16803) 1 854 73 854 233 27.28%      
402|ST, City ST, City - October (LSM) (16807) 1 851 57 851 186 21.86%      

CSVソース - > CSV

奇妙であることの一つは、それがCSVになると、私はの〜6つの分野が残ってるということですちょうどカンマ。例:

List Name,Broadcast Name,ColumC,ColumD,Colum E ,Colum,Colum F,ColumG,,,,,, 
"402|ST,City","ST, City - More Text(ACR) (16803)",1,854,73,854,233,27.28%,,,,,, 
"402|ST,City","City, ST - Text (LSM) (16807)",1,851,57,851,186,21.86%,,,,,, 

UPDATE:

追加例、更新されたソース - 列名はスペースが存在する空間を保ちます。 ブロードキャスト名の列-does-にカンマがありますが、二重引用符でエクスポートされていると仮定しています。

解決

#Create and get my Excel Obj 
$excel = New-Object -comobject Excel.Application 
$excel.visible=$false 
$excel.DisplayAlerts=$false 
$UserWorkBook = $excel.Workbooks.Open("C:\path\to\file\ExcelBook.xls") 

$UserWorksheet = $UserWorkBook.Worksheets.Item(1) 

$hitlistCSV = "C:\path\to\file\Output.csv" 
$xlCSV = 6 #changed-grav 

#Save, close, and clean up 
$UserWorksheet.SaveAs($hitlistCSV,$xlCSV) 
$UserWorkBook.close() 
$excel.quit() 
$excel = $null 


$expandfile = "C:\path\to\file\Output.csv" 

$report = get-content $ExpandFile | select -skip 1 | convertfrom-csv | ForEach-Object { 
$_."List Name" = $_."List Name".SubString(0,3) 
$_ 
} 
$report | Export-Csv ""C:\path\to\file\Output.csv" -force -NoTypeInformation 

問題は、機能を分離してエクスポート機能にわずかな変形でした。私は何らかの書き込みロックのために仮定します。

答えて

1

最後の行に問題があります。export-csvの戻り結果に$ expandfileを設定していますが、エクスポートを実行しようとしていますが、パスのみが提供されているため入力を促すプロンプトが表示されます。ただ、
$expandfile | Export-Csv "C:\Users\Donavin\Desktop\TXRH\FileExport.csv" -NoTypeInformation

EDIT

に最後の行を変更

物事が正常に動作させるためにいくつかのより多くの変更を行うには、[OK]の必要性、有効なインポート/エクスポートコードが

$expandfile = "C:\path\to\file\BroadcastReport.csv" 
(gc $expandfile | select -Skip 1) | sc $expandfile 

Import-Csv $expandfile | ForEach-Object { 
    $_."List Name" = $_."List Name".SubString(0,3) 
    $_ 
} | Export-Csv "C:\path\to\file\BroadcastReport.csv" -force -NoTypeInformation 
+0

を下回っているマイク・ヘイ - あなたの説明をありがとう。しかし、何らかの理由で、引数 "name"が無効であるため、 'Cannont process argument'にエラーが発生しました。 List_NameのスペースとImport_CSVを参照していると思いますか?ファイルは保存されていますが、「長さ」は「43」と表示されます – DNorthrup

+0

ちょっと変だけど、CSVファイルのサニタイズ版を提供できますか?データをダミーアップして数行しか必要としません。 /ローカルでのトラブルシューティング –

+0

ok私はドロー時に少し速かったかもしれないと思います。コードをもっと深く掘り下げ、Excelから保存しているファイルが 'import-csv'でインポートしているファイルではないことに気付きました。それは意図的なのですか? –

関連する問題