PowerShell Import-Csv问题 - 为什么我的输出被视为单个列而不是CSV?

时间:2015-04-27 09:29:11

标签: powershell csv

所以我有一个CSV文件,我需要操作一下,选择我需要的数据并导出到另一个CSV文件。

我的代码是:

$rawCSV = "C:\Files\raw.csv"
$outputCSV = "C:\Files\output.csv"

Import-Csv -Header @("a","b","c","d") -Path $rawCSV  |
select -Skip 7 |
Where-Object { $_.b.length -gt 1 } |
ft b,a,c,d |
Out-File $outputCSV

所以这段代码使用Import-Csv命令允许我只选择我需要的列,按我想要的顺序添加一些标题然后我只是将输出放入一个名为$ outputCSV的CSV文件中。此输出文件的内容如下所示:

b         a         c         d
-         -         -         -
john      smith     29        England
mary      poopins   79        Walton

我不确定此输出中的分隔符是什么,而不是将这些列视为个体,它们仅被视为一列。我继续使用代码用逗号替换所有空格:

$b = foreach ($line in $a)
{
    $fields = $line -split '`n'
    foreach ($field in $fields)
    {
        $field -replace " +",","
    }
}

生成一个如下所示的文件:

b,a,c,d
john,smith,29,England
mary,poppins,79,Walton

但是这些仍然被视为一列,而不是我需要的四列独立列。

*更新*

使用@给出的答案,我现在得到一个如下文件:

enter image description here

2 个答案:

答案 0 :(得分:4)

请勿使用ft重新排序您的列 - 它打算格式化屏幕输出,而不是真正适合CSV。

"手动"溶液

$rawCSV = "C:\Files\raw.csv"
$outputCSV = "C:\Files\output.csv"

# Import and filter your raw data
$RawData = Import-Csv -Header @("a","b","c","d") -Path $rawCSV  
$Data    = $RawData | Select -Skip 7 | Where-Object { $_.b.length -gt 1 }

# Write your headers to the output file
"b","a","c","d" -join ',' | Out-File $outputCSV -Force

$ReorderedData = foreach($Row in $Data){
    # Reorder the columns in each row 
    '{0},{1},{2},{3}' -f $Row.b , $Row.a , $Row.c, $Row.d
}

# Write the reordered rows to the output file
$ReorderedData | Out-File $outputCSV -Append

使用Export-Csv

从PowerShell 3.0开始,您还可以将行推送到[pscustomobject]并将管道移至Export-Csvpscustomobject保留您提供属性的顺序):

$rawCSV = "C:\Files\raw.csv"
$outputCSV = "C:\Files\output.csv"

# Import and filter your raw data
$RawData = Import-Csv -Header @("a","b","c","d") -Path $rawCSV  
$Data    = $RawData | Select -Skip 7 | Where-Object { $_.b.length -gt 1 }

# Take the columns you're interested in, put them into new custom objects and export to CSV
$Data | ForEach-Object { 
    [pscustomobject]@{ "b" = $_.b; "a" = $_.a; "c" = $_.c; "d" = $_.d } 
} | Export-Csv -NoTypeInformation $outputCSV

Export-Csv将使用引号将字符串括起来以逃避','正确(一件事你不用担心)

答案 1 :(得分:1)

首先,您的原始CSV文件是什么样的?如果已经这样了

john,smith,29,England
mary,poppins,79,Walton

然后import-csv将为您提供一个可以轻松操作的对象数组(对象是使用PowerShell的主要原因;)。例如,要检查导入后的内容:

$r = Import-Csv -Path $rawCSV -Header @("b","a","c","d") 
$r.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                              
-------- -------- ----                                     --------                                                                                                              
True     True     Object[]                                 System.Array

$r[0] | get-member

TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
a           NoteProperty System.String a=smith         
b           NoteProperty System.String b=john          
c           NoteProperty System.String c=29            
d           NoteProperty System.String d=England

现在,你有一系列对象,其属性名为" a"," b"," c"," d"。要操纵具有select-object cmdlet:

的对象
$r | Select-Object a,b,c,d

a         b        c        d                                          
-         -        -        -                                          
smith   john       29    England                                    
poppins mary       79    Walton  

然后使用export-csv设置输出文件:

$r | where { $_.b.length -gt 1 } | 
 select a,b,c,d | 
 Export-Csv -NoTypeInformation -Encoding utf8 -path $outputCSV

我可以想到将数据作为一列列出的两个可能原因:

  1. 使用应用程序期望不同的编码并且无法找到 分隔符
  2. 分隔符不是逗号,而是其他内容