【问题标题】:Modify a .csv file in powershell automatically在 powershell 中自动修改 .csv 文件
【发布时间】: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。可能它包含您的个人主页/配置文件文件夹中的路径。您可以将模块作为用户放置在那里

标签: powershell export-to-csv


【解决方案1】:

如果正如您在评论中所说,您的 Excel 已经创建了一个以分号作为分隔符的 csv,您可以在循环中执行此操作,就在 $workbook.Close() 下方

# read the file created by Excel as string array
$data = Get-Content $csvFilePath
# overwrite the file with just the new header
Set-Content -Path $csvFilePath -Value 'H;01;43;185'
# add the rest of the data to the file
$data[1..($data.Count -1)] | Add-Content -Path $csvFilePath

附:我会删除这些行

$excelApp.Visible = $true
Start-Sleep 5

因为我认为不需要让 Excel 显示自身并暂停该功能 5 秒。相反,让 Excel 根本不显示,因此通过添加它会更快地工作

$excelApp.Visible = $false

在您创建 $excelApp 之后

【讨论】:

  • 谢谢,这就是我要找的! :)
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2021-09-30
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多