所以我有一个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
但是这些仍然被视为一列,而不是我需要的四列独立列。
*更新*
使用@给出的答案,我现在得到一个如下文件:
答案 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-Csv
(pscustomobject
保留您提供属性的顺序):
$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
我可以想到将数据作为一列列出的两个可能原因: