1

我的 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 列的行(文件名应该包含第 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 问题,以完成我的大部分工作。但是,我想根据第三列重命名我的文件。由于 Windows 不接受文件名中的“:”,因此我想在将第三列附加到我的文件名之前删除“:”。我希望我的文件名如下所示:

文件名-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
}
4

1 回答 1

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
于 2013-10-16T20:13:33.457 回答