我使用-NoTypeInformation,那么为什么在使用Out-File时我会回头?

use*_*291 0 powershell

我按日期过滤了这个文件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?

Mat*_*att 6

-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.