我的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问题HERE和HERE来完成我的大部分工作。但是,我想根据第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
}
答案 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