【问题标题】:Powershell Out-File Doesn't Work For CSVPowershell 输出文件不适用于 CSV
【发布时间】:2014-05-26 02:46:45
【问题描述】:

我有以下代码:

$databaseContents = "col1,col2,col3,col4"
$theDatabaseFile = "C:\NewFolder\Database.csv
$databaseContents | Out-File $theDatabaseFile

但是,当我在 Excel 中打开 csv 文件时,它在单元格 A1 中有 col1、col2、col3、col4 而不是单元格 A1 中的 col1、单元格 B1 中的 col2 等。

我注意到了一些奇怪的事情: 如果我在记事本中打开文件并将文本复制到另一个记事本实例中并将其保存为 Database1.csv,然后在 Excel 中打开它,它会按预期显示。

如何让Out-File 命令行开关将其另存为 .csv 文件,内容按预期分为 4 列?

编辑: 我注意到如果我使用Set-Content 而不是Out-File,则 csv 文件会在 Excel 中正确显示。 有谁知道这是为什么?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    为什么它对 Excel 有影响我不清楚,但它归结为生成的输出文件的编码 - Unicode(在不起作用的情况下)与 ASCII(在起作用的情况下)。

    @JPBlanc 的替代方法有效,因为它将输出文件的编码设置为 ASCII,而您的原始示例(隐式)将输出文件的编码设置为 Unicode。

    只需将-Encoding ascii 添加到您的原始示例中也可以正常工作:

    $databaseContents = "col1,col2,col3,col4"
    $theDatabaseFile = "C:\NewFolder\Database.csv
    $databaseContents | Out-File $theDatabaseFile -Encoding ascii
    

    在原始示例中添加显式 -Encoding unicode 会产生与您遇到的相同的损坏结果:

    $databaseContents = "col1,col2,col3,col4"
    $theDatabaseFile = "C:\NewFolder\Database.csv
    $databaseContents | Out-File $theDatabaseFile -Encoding unicode
    

    这基本上是隐含发生的事情。

    【讨论】:

    • 感谢您的回答!所以基本上如果excel读取以ascii以外的任何编码编码的文本,它只会将其视为纯文本? IE。它不会将逗号读取为分隔值。
    • @Backwards_Dave:这是一个合理的假设,但我承认,我对 Excel 的理解不够巧妙,无法确定。原始的Out-File-生成的Database.csv 工作正常(即分别在单元格A1A2A3 和@9876 中显示col1col2col3col4 ) if 而不是双击它在 Excel 中打开它我首先打开 Excel,然后通过 Excel 打开它并通过文本导入向导。也许具有相关 Excel 专业知识的人可以肯定地说为什么它在如此简单的场景中关心 Unicode 与 ASCII。
    【解决方案2】:

    这也有效:

    $databaseContents = "col1;col2;col3;col4"
    $theDatabaseFile = "C:\temp\Database.csv"
    $databaseContents | Out-File $theDatabaseFile -Encoding ascii
    

    默认情况下,Excel 接缝中的 CSV 分隔符为 ';'和 Out-File 保存为 unicode 强制 ASCII 接缝给出你想要的结果。

    【讨论】:

    • 我很确定默认分隔符是逗号,因此它被称为“逗号分隔值”。我尝试使用分号,但没有用。我所做的尝试是在保留逗号的同时使用 -Encoding ascii 而不是用分号替换它们,并且效果很好。
    • 你是绝对正确的 CSV 表示逗号分隔值。但是当我将 Excel 文件另存为 CSV 时,默认情况下 Excel 使用 ;这就是我写那个的原因。
    • 奇怪,对我来说,当我将其保存为 .csv 时它使用逗号
    • 这不是我的情况。可能是因为我用的是法文版
    【解决方案3】:

    我遇到了与 Backwards_Dave 相同的问题,就像他一样,使用 Set-Content 而不是 Out-File 命令对我有用:

    #Build $temp String
    $temp = "$scriptApplication;$applicationName;$type;$description;$maxSessions;$enabled;$tempParams`n"
    
    #Write $temp String to $fichierCsv file
    "$temp" | Set-Content $fichierCsv
    

    我尝试使用 JPBlancJ0e3gan 的解决方案,但它不起作用(-Encoding ascii 选项):我想知道为什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多