2016-11-04 74 views
1

我问了一个类似的问题here,它让我走上了一条非常好的轨道,但是在尝试“全在一起”时,我最终遇到了一个问题。我非常接近,但经过测试众多理论后,我开始扭转需要的东西。CSV合并后不导出

我有多个表的Excel - 我需要拉第一板,CSV,国际预科,然后取出头,则只能从第一行获得第3位(“列表名称”)

我的PS是:

#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 

我修改了很多,并试图使其单可运行,以避免计划多蝙蝠。一切似乎都奏效 - 它拉出第一张纸,重新命名它,并在每次运行第二部分时替换第一行。但是,SubString部分没有生效,我也没有得到'FileExport'文件。

我现在最后一次修改使它每次都回复我需要'提供输入对象',所以我觉得它与函数化它有关。作为参考,我需要分割的行是双引号,因为它有逗号。例如:

"123|ST,City" 

我只需要123.当我只是导入文件并运行我的ForEach函数时,输出是我所期望的。只是将它保存到文件不是。

谢谢。

欢迎任何输入。

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来源XLS后 - > 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

问题出在您的最后一行,您将$ expandfile设置为export-csv的返回结果,它会提示您提供输入,因为它正在尝试执行导出,但仅提供了路径。就在最后一行更改为
$expandfile | Export-Csv "C:\Users\Donavin\Desktop\TXRH\FileExport.csv" -NoTypeInformation

编辑

确定需要做一些更多的改变的东西才能正常工作,有效的导入/导出代码如下

$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

嘿迈克 - 谢谢你的解释。然而,现在由于某种原因,它错误'Cannont过程参数,因为参数“名称”是无效的“ 我在想它是引用我的Import_CSV和列表名称中的空间?有关这方面的任何洞察? 目前我是获得一个文件保存,但它只是说“长度”“43” – DNorthrup

+0

嗯,这很奇怪,你可以提供一个CSV文件的净化版本?你可以虚拟了数据,只需要几行,我只想测试/本地疑难解答 –

+0

好吧我想我可能在绘图上有点太快了,现在深入挖掘代码,我注意到你从excel中保存的文件不是你使用'import-csv'导入的文件那是故意的? –