我按日期过滤了这个文件data1.csv
2017.11.1,09:55,1.1,1.2,1.3,1.4,1
2017.11.2,09:55,1.5,1.6,1.7,1.8,2
Run Code Online (Sandbox Code Playgroud)
我没有得到标题-NoTypeInformation:
$CutOff = (Get-Date).AddDays(-2)
$filePath = "data1.csv"
$Data = Import-Csv $filePath -Header Date,Time,A,B,C,D,E
$Data2 = $Data | Where-Object {$_.Date -as [datetime] -gt $Cutoff} | convertto-csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''}
Run Code Online (Sandbox Code Playgroud)
但是当重写时 Out-File
$Data2 | Out-File "data2.csv" -Encoding utf8 -Force
Run Code Online (Sandbox Code Playgroud)
我得到了标题,因为data2.csv包含:
Date,Time,A,B,C,D,E
2017.11.2,09:55,1.5,1.6,1.7,1.8,2
Run Code Online (Sandbox Code Playgroud)
为什么我有日期,时间,A,B,C,D,E?
-NoTypeInformation不是标题,而是文件中行的数据类型.删除它以查看显示的内容.来自微软
忽略输出中的类型信息标题.默认情况下,输出中的字符串包含#TYPE,后跟对象类型的完全限定名称.
强调我的.
CSV需要标题.这就是它制作一个原因.如果您不想在输出中看到标题,请使用Select-Object -Skip 1它来删除它.
$Data |
Where-Object {$_.Date -as [datetime] -gt $Cutoff} |
ConvertTo-CSV -NoTypeInformation -Delimiter "," |
Select-Object -Skip 1 |
% {$_ -replace '"'}
Run Code Online (Sandbox Code Playgroud)
我不管Out-File自己.你也可以去Set-Content这里.
我猜这整个过程是将源文件保持在相同的状态,只是根据日期过滤掉一些行.您可以通过解析每行中的日期来跳过大部分内容.
$threshold = (Get-Date).AddDays(-2)
$filePath = "c:\temp\bagel.txt"
(Get-Content $filePath) | Where-Object{
$date,$null=$_.Split(",",2)
[datetime]$date -gt $threshold
} | Set-Content $filePath
Run Code Online (Sandbox Code Playgroud)
现在您不必担心PowerShell CSV对象结构或输出,因为我们处理文件本身的原始数据.
这将获取输入文件的每一行,如果解析的日期与阈值不匹配,则将其过滤掉.根据需要更改输入输出cmdlet上的编码.什么$date,$null=$_.Split(",",2)是做的是分裂的逗号线分为两个部分.第一个变成了$date,因为这只是一个过滤条件,我们将该行的其余部分转储到$ null.
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |