我有一个大约2500列的CSV文件,没有按管道拆分的标题|定界符。
file.csv看起来像这样:
x,y,z,x1,x2,x3,x4,x5,x6,x7,x8,x9,...(about 2500 more)...,x2500
0,0,0,a1,a2,a3,a4,a5,a6,a7,a8,a9,...(about 2500 more)...,s2500
1,1,1,b1,b2,b3,b4,b5,b6,b7,b8,b9,...(about 2500 more)...,b2500
….
我想根据其列号将此文件拆分为多个文件。
使用Bash,我使用了cut -d "|" -f1,2-901
并选择了要保存在新文件中的列。
输出:
file1.csv
Key1,x2,x3,x4,x5,x6,x7,x8,x9,...(about 900 more)...,x900
Key2,a2,a3,a4,a5,a6,a7,a8,a9,...(about 900 more)...,a900
Key3,b2,b3,b4,b5,b6,b7,b8,b9,...(about 900 more)...,b900 <BL>
…
file2.csv
Key1,x901,x902,x903,x904,...(about 900 more)...,x1800
Key2,a901,a902,a904,a904,...(about 900 more)...,a1800
Key3,b901,b902,b903,b904,...(about 900 more)...,b1800
…
我如何在Powershell中做到这一点?
任何帮助将不胜感激。
答案 0 :(得分:1)
使用选择对象仅获取所需的列。
为标题/属性构建一个数组
此脚本创建的csv仅包含25列用于演示
## Q:\CsvData\2018\12\31\SO_53988782.ps1
$file = '.\Data.csv'
#create sample csv with headers x1..x25
(1..25|ForEach-Object{"x{0}" -f $_}) -join ',' | set-content $file
(1..25|ForEach-Object{$_}) -join ',' | add-content $file
Get-Content $file
$Range1 = 1..9 | ForEach-Object{"x{0}" -f $_}
$Range2 = 10..19| ForEach-Object{"x{0}" -f $_}
$CsvData = Import-csv $file
$CsvData | Select-Object $Range1 | Format-Table -auto
$CsvData | Select-Object $Range2 | Format-Table -auto
> Get-Content $file
x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
> $CsvData | Select-Object $Range1 | Format-Table -auto
x1 x2 x3 x4 x5 x6 x7 x8 x9
-- -- -- -- -- -- -- -- --
1 2 3 4 5 6 7 8 9
> $CsvData | Select-Object $Range2 | Format-Table -auto
x10 x11 x12 x13 x14 x15 x16 x17 x18 x19
--- --- --- --- --- --- --- --- --- ---
10 11 12 13 14 15 16 17 18 19