首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PowerShell处理CSV数据

用PowerShell处理CSV数据
EN

Stack Overflow用户
提问于 2014-12-05 16:18:49
回答 2查看 1.2K关注 0票数 0

我正在使用Invoke- vendor从供应商获得CSV格式的数据。数据不是我需要的格式(需要发送给另一个供应商)--每个“集合”有四列,CSV中可以有任意数量的“集合”--列标题名称不是静态的--每四列都是一个完整的集合。

Column1a,Column2a,Column3a,Column4a,Column1z,Column2z,Column3z,Column4z

数据,数据

我需要做的是输出列1-4,5-8,9-12等来分离CSV,我甚至不知道从哪里开始。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-05 17:54:34

试着做这样的事情:

代码语言:javascript
复制
$csv     = Import-Csv 'input.csv'
$headers = $csv[0].PSObject.Properties | select -Expand Name
$step    = 4

for ($i = 0; $i -lt $headers.Count; $i += $step) {
  $csv | select $headers[$i..($i+$step-1)] |
    Export-Csv "output_$($i/$step).csv" -NoType
}

Import-Csv从输入文件创建对象列表,其中CSV列名成为对象属性名称。因此,您可以通过展开对象的属性名称从对象中提取标题名称。使用要导出的每个输出文件的列数的步骤大小在标头数组上迭代,并使用范围运算符(..)选择要在当前迭代中导出的列。

票数 5
EN

Stack Overflow用户

发布于 2014-12-05 17:31:42

拥有样本数据会很好,但我认为解决方案的jist并不需要它。使用您的列,我创建了4个列分组数据。第一组包含字母,第二组包含数字。最后,它们将放在单独的文件中。

代码语言:javascript
复制
Column1a, Column2a, Column3a, Column4a, Column1z, Column2z, Column3z, Column4z
A,B,C,D,1,2,3,4
A,B,C,D,1,2,3,4
A,B,C,D,1,2,3,4
A,B,C,D,1,2,3,4
A,B,C,D,1,2,3,4
A,B,C,D,1,2,3,4

因此,我不关心数据是如何到达的,所以我在我的示例中使用Get-Content导入数据,以获得原始的csv数据,这大概是从Invoke-RestMethod获得的。现在,假设列名位于第一行,则从该数据中提取第一行为$header的列。如果不是,您可以使用Select -Index 2,如果它是第二行。边注,我想我可以从Get-Member得到它,但是它把列按字母顺序排列,所以它被取消了,尽管answer的答案比我的更干净。

在获取标头之后,我们将数据转换为一个对象以供进一步处理。魔术来自于循环,它在4列组中导航对象。警告:,我假设您的列是4的倍数,这样才能很好地工作。

对于输出,只需取我们目前在$groupHeaders中的4列,然后连接到一个字符串中。特殊人物可能会搞砸那个人。很容易用一个小正则表达式来解决。

代码语言:javascript
复制
$outputPath = "C:\temp\"
$data = GC C:\temp\null.csv

#$header = $data | gm -MemberType NoteProperty | Select-Object -ExpandProperty Name
$header = ($data | select -first 1).split(",") | ForEach-Object{$_.Trim()}
$data = $data | ConvertFrom-Csv 

$specialCharactersRegex = [regex]::Escape('"*/:<>?\|')

For($group = 1;$group -le ($header.Count / 4);$group++){

    $headerStartIndex = ($group - 1) * 4
    $groupHeaders = $header[$headerStartIndex..($headerStartIndex+3)]

    $data | Select @($groupHeaders) | Export-CSV "$outputPath$(($groupHeaders -join '') -replace $specialCharactersRegex).csv" -NoTypeInformation
}

在这之后,我有以下两个文件,其中包含来自它们各自列的数据。

代码语言:javascript
复制
Column1aColumn2aColumn3aColumn4a.csv
Column1zColumn2zColumn3zColumn4z.csv
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27320245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档