我问了一个类似的问题here,它让我走上了一条非常好的轨道,但是当我试图'一体化'时,我最终遇到了一个问题。我非常接近,但在测试了很多理论后,我开始扭转我的需要。
我有一个多表Excel - 我需要拉第一张,CSV-ify,然后删除标题,然后只从第一行得到前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
我已经对它进行了很多修改,并尝试将其单一运行以避免安排多个BAT。一切似乎都有效 - 它拉出第一张纸,重新命名,并在每次运行第二部分时替换顶线。但是,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%
XLS之后的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%,,,,,,
更新
添加了示例,更新了源 - 列名称保留了空格所在的空间。 广播名称列-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
问题是对作为分离函数的导出函数稍作修改。我假设由于某种写锁定。
答案 0 :(得分: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