【发布时间】:2020-11-20 10:00:54
【问题描述】:
我尝试创建一个 powershell 脚本,执行几个步骤:
- 在特定文件夹中,我放置了一个 .xlsx 文件,它将其转换为 csv。到目前为止,我得到了这个:
$ErrorActionPreference = 'Stop'
Function Convert-CsvInBatch
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][String]$Folder
)
$ExcelFiles = Get-ChildItem -Path $Folder -Filter *.xlsx -Recurse
$excelApp = New-Object -ComObject Excel.Application
$excelApp.DisplayAlerts = $false
$ExcelFiles | ForEach-Object {
$workbook = $excelApp.Workbooks.Open($_.FullName)
$csvFilePath = $_.FullName -replace "\.xlsx$", ".csv"
$workbook.SaveAs($csvFilePath, [Microsoft.Office.Interop.Excel.XlFileFormat]::xlCSV)
$workbook.Close()
}
# Release Excel Com Object resource
$excelApp.Workbooks.Close()
$excelApp.Visible = $true
Start-Sleep 5
$excelApp.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null
}
#
# 0. Prepare the folder path which contains all excel files
$FolderPath = "C:\exacthpath"
Convert-CsvInBatch -Folder $FolderPath
- 文件中的列仍然存在,所以我想删除它们,并插入一个';'相反,例如: H;1;43;185;
此时我被卡住了。我可以将它导入到 Powershell 中,例如:
Import-Csv -Path 'C:\folder\filename.csv' | ForEach-Object {
$_
}
我看到这个,最重要的任务在这里,只在第一行:
H;1;43;185;
这应该修改成:
H;01;43;185
其余部分应保持不变。 在我需要将其导出回 CSV 文件后,例如:
Export-Csv -Path 'C:\folder\modified_filename.csv'
但这整个过程应该插入到一个单独的 powershell 脚本中,它自己执行上述步骤。简而言之:
- 识别任何 .xlsx 文件 - 无论其名称如何
- 将其转换为 .csv
- 修改文档的外观,用“;”分隔列
- 将第一行修改为 'H;01;43;185' - 这是一条静态行,它将始终如下所示
- 将创建的文件保存为最终的 .csv 文件
你能帮助我以某种方式包含/优化上述脚本并让 powershell 也执行修改吗?像这样的文件的示例内容(最终外观)通常包含超过 1000 行:
H;01;43;185
D;111;3;1042;2
D;222;3;1055;3
D;333;3;1085;1
T;3;;;
非常感谢任何帮助。
问候, 阿明
【问题讨论】:
-
我想到的第一件事是我认为您会对出色的模块ImportExcel 感兴趣。 Excel com 界面很慢
-
Excel 创建 CSV 时实际使用的分隔符是什么?那是逗号还是分号 (
;)。如果它是分号,您的Import-Csv -Path 'C:\folder\filename.csv'将不起作用,因为没有-Delimiter ';'它会将所有行作为一列导入。当文件中的数据似乎有 5 列,而不仅仅是这 4 列时,拥有像'H;01;43;185这样的标题的逻辑是什么。 -
@Theo 我的分隔符是分号,与示例中的相同。是的,本来是一个5列的文件,但是第一行第5列的分号需要删掉,不然导入这个文件的程序就不能识别了。
-
@GertJanKraaijeveld,我尝试这种方式,但由于计算机是办公室的计算机 - 所以我需要管理员权限才能执行此操作。我们会卖...
-
检查您的
$env:PSModulePath。可能它包含您的个人主页/配置文件文件夹中的路径。您可以将模块作为用户放置在那里