powershell - 根据列值重命名csv文件

时间:2013-10-16 19:02:20

标签: powershell csv rename

我的CSV文件包含以下内容:

currentTime, SeqNum, Address
1381868225469, 0, 
1381868226491, 1, 38:1c:4a:0:8d:d 
1381868227493, 1, 
1381868228513, 2, 38:1c:4a:0:8d:d 
1381868312825, 43, 
1381868312916, 1694564736, 3a:1c:4a:1:a1:98 
1381868312920, 1694564736, 3a:1c:4a:1:a1:98 
1381868312921, 44, 

根据第3列是否为空,我想将文件分成2个或更多文件(包含第3列的行(fileName应包含第3列)和不包含第3列的文件。

示例输出:

**File0.txt**
1381868225469, 0, 
1381868227493, 1, 
1381868312825, 43, 
1381868312921, 44, 

**File1-381c4a08dd.txt**
1381868226491, 1, 38:1c:4a:0:8d:d 
1381868228513, 2, 38:1c:4a:0:8d:d 

**File2-3a1c4a1a198.txt**
1381868312916, 1694564736, 3a:1c:4a:1:a1:98 
1381868312920, 1694564736, 3a:1c:4a:1:a1:98 

我提到了stackoverflow问题HEREHERE来完成我的大部分工作。但是,我想根据第3列重命名我的文件。因为,Windows不接受文件名中的“:”,我想在将第3列附加到我的文件名之前删除“:”。我希望我的文件名看起来像这样:

文件名-381c4a08dd.txt

我该如何解决这个问题?到目前为止,这是我的尝试:

import-csv File.txt | group-object Address | foreach-object {
$_.group | select-object currentTime, SeqNum, Address | convertto-csv -NoTypeInformation | %{$_ -replace '"', ""} | out-file File-$($_.Address.remove(':')).txt -fo -en ascii
}

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

$csv = Import-Csv 'C:\path\to\file.txt'
$n = 0

# export rows w/o address
$outfile = 'File${n}.txt'
$csv | ? { $null, '' -contains $_.Address } |
  Export-Csv $outfile -NoTypeInformation

# export rows w/ address
$csv | ? { $null, '' -notcontains $_.Address } | Group-Object Address | % {
  $n++
  $outfile = "File${n}-" + $_.Name.Replace(':', '') + '.txt'
  $_.Group | Export-Csv $outfile -NoTypeInformation
}

过滤器$null, '' -contains $_.Address是必需的,因为当您在输入文件的最后一行中有一个空地址且没有尾随换行符时,地址记录将为$null

如果您希望创建没有标题行的输出文件,则需要替换

... | Export-Csv $outfile -NoTypeInformation

... | ConvertTo-Csv -NoTypeInformation | select -Skip 1 | Out-File $outfile