首页 > 解决方案 > 如何读取文件夹中的每个 csv 文件并从 csv 文件中删除引号字符?

问题描述

如何读取特定文件夹的每个 csv 文件?当执行下面的脚本时,它只会删除一个 csv 文件的引号字符。

$file="C:\test\IV-1-2020-04-02.csv"

(GC $file) | % {$_ -replace '"', ''}  > $file

Get-ChildItem -Path C:\test\  -Filter '*.csv'

输出只会删除“IV-1-2020-04-02.csv”的引号字符。如果我有不同的文件名怎么办?

标签: powershellcsv

解决方案


您可以使用using迭代每个.csv文件Get-ChildItemreplace引号。"''Set-Content

$files = Get-ChildItem -Path "YOUR_FOLDER_PATH" -Filter *.csv

foreach ($file in $files)
{
    Set-Content -Path $file.FullName -Value ((Get-Content -Path $file.FullName -Raw) -replace '"', '')
}

确保将您的文件夹路径传递给-Path,它告诉Get-ChildItem您从此文件夹中获取每个文件

使用开关 for也更快,因为它将文件读入一个字符串并保留换行符。如果您省略此开关,默认情况下将通过换行符将行拆分为字符串数组-RawGet-ContentGet-Content

如果您还想读取更深的子目录中的文件,请将-Recurse开关添加到Get-ChildItem

$files = Get-ChildItem -Path "YOUR_FOLDER_PATH" -Filter *.csv -Recurse

此外,您还可以Foreach-Object在此处使用:

Get-ChildItem -Path "YOUR_FOLDER_PATH" -Filter *.csv -Recurse | ForEach-Object {
    Set-Content -Path $_.FullName -Value ((Get-Content -Path $_.FullName -Raw) -replace '"', '')
}

此外,您可以替换Foreach-Object为它的别名%。但是,如果您使用 VSCode 并已PSScriptAnalyzer启用,您可能会收到以下警告:

“%”是“ForEach-Object”的别名。别名可能会引入可能的问题并使脚本难以维护。请考虑将别名更改为其完整内容。

这警告不要使用别名来维护可维护性。使用完整版更安全、更便携。我只使用别名来快速使用命令行,但在编写脚本时我使用完整版本。

注意:如果某些行需要引用,上述解决方案可能会损坏 CSV。该解决方案只需遍历整个文件并将每个引号替换为''. PowerShell 7为 提供了一个-UseQuotes AsNeeded选项Export-Csv,因此您可以研究一下。


推荐阅读