【问题标题】:PowerShell Import-CSV adding spaces between charactersPowerShell Import-CSV 在字符之间添加空格
【发布时间】:2016-05-11 15:19:43
【问题描述】:

我有一个 CSV 文件,它在导入 PowerShell 之前看起来一切正常,当它导入的每个字符后跟一个空格,如 C : \ 而不是 C:\

在 Excel 中将单元格格式化为文本很容易(可行),但此 CSV 文件是通过自动化策略在多个服务器上创建的,因此浏览每个文件并格式化它们需要一段时间可以想象。

我想知道是否有一种方法可以先在 PowerShell 中格式化单元格,然后导入 CSV。

我正在使用的 PowerShell 代码:

$data = import-csv -Path $path -UseCulture -Header @("Path", "Folder", "Size")

CSV 片段:

C:\,C:\,14.0GB C:\Program Files,Program Files,4.5GB C:\Program Files\Microsoft Office,Microsoft Office,2.8GB

【问题讨论】:

    标签: excel csv powershell


    【解决方案1】:

    听起来文件可能是 Unicode,但没有正确的字节顺序标记,这将导致 PowerShell 使用默认的 ASCII 编码。如果是这种情况,您需要指定编码:

    $data = import-csv -Encoding Unicode -Path $path ...
    

    另一种选择是在导入之前将文件转换为 ASCII [归功于 OP 的命令]:

    Get-content C:\path\TestXml.csv | Set-Content -Encoding Ascii TestXml.csv

    【讨论】:

    • Import-Csv :找不到与参数名称“编码”匹配的参数。在 line:5 char:29 + $data = import-csv -Encoding
    • 显然 - 找不到编码。它是一个参数吗?
    • Encoding 参数不能在您使用的 PowerShell 版本中提供...
    • 在记事本中打开 csv 文件,然后执行文件 -> 另存为。查看底部并查看编码设置为。如果它不是 ANSI,或者如果记事本也显示字符之间的空格,那么编码可能是问题所在。除了升级 PowerShell 以获取 -Encoding 参数外,另一种选择是在导入文件之前将文件转换为 ANSI/ASCII。我不知道有任何实用程序可以做到这一点。另一种选择是修复创建文件的过程,以便将其保存为 ANSI/ASCII。
    • 你让我走上正轨,我会把我使用的解决方案作为答案
    【解决方案2】:

    这可能会出现不同的问题,但它可能适用于删除所有空格

    $data = import-csv -Path $path -UseCulture -Header @("Path", "Folder", "Size")
    $data | % {
        $_.path = $_.path -replace '\s'
        $_.folder = $_.folder -replace '\s'
        $_.size = $_.size -replace '\s'
    }
    $data
    

    【讨论】:

      【解决方案3】:

      了解 CSV 的外观会很有帮助。你能提供标题和 1 或 2 行吗?

      CSV 文件中是否指定了标头?

      使用 Header 参数时,从 CSV 文件中删除原始标题行。否则,Import-Csv 从标题行中的项目创建一个额外的对象。 https://technet.microsoft.com/en-us/library/hh849891.aspx

      您正在指定 UseCulture 开关,该开关将使用环境指定的默认分隔符。您可以运行以下命令来查找您的文化的分隔符:

      (Get-Culture).TextInfo.ListSeparator
      

      https://technet.microsoft.com/en-us/library/hh849891.aspx

      【讨论】:

      • 我故意不给它一个标题,因为它在 powershell 中提供了一个标题。我更新了我的问题以包含几行。
      • @SamLucas 你在使用 Import CSV 来导入 XML 文件吗?
      • 不,它正在导入 CSV 文件
      • 如果能看到一些 CSV 文件以进行故障排除,那就太好了。
      • 我的问题中包含了几行
      【解决方案4】:

      @Tony Hinkle 向我发送了正确的方向,因此我将他的答案标记为正确,这是我使用的代码:

      将 CSV 的内容设置为 ascii 编码

      Get-content C:\Users\sam\Desktop\TestXml.csv | Set-Content -Encoding Ascii TestXml.csv
      

      然后导入 Csv

      $data = Import-Csv C:\Users\sam\Desktop\TestXml.csv -Header @("Path", "Folder", "Size")
      

      【讨论】:

      • 感谢您的跟进——很高兴我能提供帮助。我将使用此信息更新我的答案,以便将所有信息集中在一个地方。