Excel 合并后不导出CSV
我问了一个类似的问题,这让我走上了一条非常好的道路,然而,当我试图“一网打尽”时,我最终遇到了一个问题。我非常接近,但在测试了大量理论后,我开始逆转我需要的 我有一个多工作表Excel-我需要拉第一个工作表,将其转换为CSV格式,然后删除标题,然后只获取第一行的前3位数字。(“列表名”) 我的私人秘书是:Excel 合并后不导出CSV,excel,powershell,csv,Excel,Powershell,Csv,我问了一个类似的问题,这让我走上了一条非常好的道路,然而,当我试图“一网打尽”时,我最终遇到了一个问题。我非常接近,但在测试了大量理论后,我开始逆转我需要的 我有一个多工作表Excel-我需要拉第一个工作表,将其转换为CSV格式,然后删除标题,然后只获取第一行的前3位数字。(“列表名”) 我的私人秘书是: #Create and get my Excel Obj $excel = New-Object -comobject Excel.Application $excel.visible=$
#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。一切似乎都正常-每次我运行第二部分时,它都会拉出第一张图纸,重命名它,并替换顶行。但是,子字符串部分没有生效,我也没有得到“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%,,,,,,
更新:
添加了一个示例,更新后的源列名会在存在空格的地方保留一个空格。
广播名称列-确实-有一个逗号,但我假设它是用双引号导出的
分辨率
#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
问题是对导出函数进行了轻微修改,使其成为独立的函数。我假设是由于某种写入锁定。问题出现在最后一行,您将$expandfile设置为导出csv的返回结果,它会提示您提供输入,因为它正在尝试执行导出,但只提供了一个路径。只需将最后一行更改为
$expandfile |导出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
迈克,谢谢你的解释。但是,现在由于某种原因,它在“Cannot process”参数上出错,因为参数“name”无效“我认为它引用了我的导入CSV和列表名中的空格?对此有什么见解吗?目前我正在保存一个文件,但它只显示“Length”43“嗯,这很奇怪,你能提供CSV文件的净化版本吗?你可以伪造数据,只需要几行,我只是想测试/排除本地故障OK我想我可能画得有点太快了,现在深入研究代码,我注意到您从excel保存的文件不是您使用
import csv
导入的文件,这是故意的吗?是-我认为它必须导出到单独的文件中。FileA.XLS->FileB.CSV-(拆分)>FileC.CSV我可以只做FileA.XLS->FileB.CSV-(拆分>FileB.CSV吗?我现在有点困惑,你可以使用export CSV-force
覆盖文件,但从现在开始,你导入的文件与你通过excel保存的文件无关。你保存到“C:dir\to\file\Output.CSV”
然后导入“C:\Users\Donavin\Desktop\TXRH\BroadcastReport.csv”
,我是否遗漏了某个步骤?或者这些文件应该是无关的?