我需要将csv文件导入到我的PS脚本中。在同一个脚本中,我有一个函数将xlsx文件转换为csv,我需要导入它。但我找不到办法做到这一点。我尝试了三种方法:
$CSVLicence = Import-Csv (ConvertXLSX -File $Licence) -Delimiter "," -Encoding UTF8
其中ConvertXLSX是将xlsx转换为csv的函数,$ License是在脚本开头定义的变量。第二种方法是:
$CSVfile = ConvertXLSX -File $Licence
$CSVLicence = ImportCsv $CSVfile -Delimiter "," -Encoding UTF8
在这两种情况下,我在" Import-Csv"之后的列上收到错误消息,该参数Path为null或为空。
第三种方法是从字面上定义路径,这不是一个很好的解决方案,但如果文件的执行者在正确的文件夹中运行并使用正确的文件名,则应该有效。在这种情况下,我收到一个错误"会员" Proemail Exchg Business"已经存在"在" Import-Csv"前面小命令
创建csv文件并且它看起来应该是正确的,因此转换函数中显然不会出现错误。
ConvertXLSX函数的定义如下:
$Licence = "licence"
Function ConvertXLSX ($File)
{
$PWD = "r:\Licence\"
$ExcelFile = $PWD + $File + ".xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$Excel.DisplayAlerts = $false
$wb = $Excel.Workbooks.Open($ExcelFile)
foreach ($ws in $wb.Worksheets | where {$_.name -eq "Pridani"})
{
$ws.SaveAs($PWD + $File + ".csv",6)
}
$Excel.Quit()
}
ConvertXLSX -File $Licence
该函数成功创建了csv文件,没有任何问题
答案 0 :(得分:3)
您目前正在使用错误的cmdlet。 Import-Csv
旨在与file.csv
一起使用,而不是字符串对象或其他。为此目的存在一个cmdlet,ConvertFrom-Csv
,它接受-InputObject
参数(表示它需要管道输入)。
PS C:\> Get-Help -Name 'ConvertFrom-Csv'
SYNTAX
ConvertFrom-Csv [-InputObject] <PSObject[]> [[-Delimiter] <Char>] [-Header <String[]>]
在您的示例中使用:
## Declaration of the delimiter is unnecessary when it's a comma
$CSVLicense = ConvertXLSX -File $Licence | ConvertFrom-Csv
答案 1 :(得分:0)
TheIncorrigible1很好地解释了这个问题。既然您已经编辑了要添加ConvertXLSX
函数的问题,我们可以在此基础上构建一个适合的解决方案。
$ws.SaveAs($PWD + $File + ".csv",6)
此部分是保存到文件名$PWD + $File + ".csv"
。数字6
代表CSV XlFileFormat Enumeration。
该函数不返回任何内容,只对外部文件执行操作。这就是你得到null或空错误的原因。我们可以让它返回文件路径,或者返回对象中的数据并使用ConvertFrom-Csv
。
鉴于您的代码,该对象需要更多的工作,因为您已经有了文件路径 要返回文件路径,请更改:
}
$Excel.Quit()
}
要:
}
$Excel.Quit()
return $($PWD + $File + ".csv")
}
然后你的代码就可以了。
你可以更好地提高它的可读性和简洁性:
将CSV文件名分配给变量。
避免分配给$PWD
,因为它是Get-Location
的别名
摆脱foreach
。您目前只获得一张表并保存该表。如果您要处理多个工作表,则必须考虑如何将多个路径/对象传递给Import-Csv
/ ConvertFrom-Csv
全部放在一起:
$Licence = "licence"
Function ConvertXLSX ($File)
{
$rootDir = "r:\Licence\"
$ExcelFile = $rootDir + $File + ".xlsx"
$CSVFile = $ExcelFile.Replace(".xlsx",".csv")
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$Excel.DisplayAlerts = $false
$wb = $Excel.Workbooks.Open($ExcelFile)
$ws = $wb.Worksheets | where {$_.name -eq "Pridani"})
$ws.SaveAs($CSVFile,6)
$Excel.Quit()
return CSVFile
}
ConvertXLSX -File $Licence
我收到错误&#34;会员&#34; Proemail Exchg Business&#34;已经存在&#34;在&#34; Import-Csv&#34;前面小命令
此问题由this StackOverflow post处理。简短版本是第一行中有&#34; Proemail Exchg Business&#34; 的两列。
PowerShell从CSV创建对象:列标题必须是唯一的。可以在Excel工作表中进行修复,也可以使用链接帖子中的-Header
手动指定唯一标头。