【问题标题】:How to read every csv file in the folder and remove quote character from the csv file?如何读取文件夹中的每个 csv 文件并从 csv 文件中删除引号字符?
【发布时间】:2020-04-05 02:10:36
【问题描述】:

如何读取特定文件夹中的每个 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”的引号字符。如果我有不同的文件名怎么办?

【问题讨论】:

标签: powershell csv


【解决方案1】:

您可以使用Set-ContentGet-ChildItemreplace"'' 中迭代每个.csv 文件。

$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 获取此文件夹中的每个文件

Get-Content 使用-Raw 开关也更快,因为它将文件读入一个字符串并保留换行符。如果省略此开关,Get-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 7Export-Csv 提供了一个 -UseQuotes AsNeeded 选项,因此您可以改为查看该选项。

【讨论】:

    【解决方案2】:

    不要只替换所有",除非您非常确定这是一个好主意;否则请替换",因为该字段不包含带逗号、双引号或换行符的文本。 (参见RFC-4180 第 2 节,#6 和 #7)

    与覆盖其工作文件的任何脚本一样,如果您稍后需要撤消选项,请确保您备份了这些文件...

    $tog = $true 
    $sep = ':_:'
    $header=@()
    
    filter asString{
       $obj=$_
       
       if($tog){
          $header=(gm -InputObject $obj -Type NoteProperty).Name
          $hc = $header.Count-1
          $tog=$false
    
          $str = $header -join $sep
          $str = "$sep$str" -replace '"','""'
          $str = $str -replace "$sep(((?!$sep)[\s\S])*(,|""|\n)((?!$sep)[\s\S])*)",($sep+'"$1"')
          ($str -replace $sep,',').Substring(1)
       }
    
       $str = (0..$hc | %{$obj.($header[$_])}) -join $sep
       $str = "$sep$str" -replace '"','""'
       $str = $str -replace "$sep(((?!$sep)[\s\S])*(,|""|\n)((?!$sep)[\s\S])*)",($sep+'"$1"')
       ($str -replace $sep,',').Substring(1)
    }
    
    ls *.csv | %{$tog=$true;import-csv $_ | asString | sc "$_.new";$_.FullName} | %{if(test-path "$_.new"){mv "$_.new" $_ -force}}
    

    注意:CSV 文件应包含自己的标题。如果您需要使用Import-Csv-Header 选项,您可以解决这个问题

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2019-07-08
      • 2019-03-11
      • 2016-06-14
      • 2022-01-20
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      相关资源
      最近更新 更多