Powershell 坚持这个PS脚本

Powershell 坚持这个PS脚本,powershell,Powershell,我有一个包含数百万条记录的文本文件 我想从每一行中找出不是以字符串+行号开头的行(字符串以双引号01/01/2019开头) 你能帮我修改这个代码吗 Get-Content "(path).txt" | Foreach { if ($_.Split(',')[-1] -inotmatch "^01/01/2019") { $_; } } 谢谢根据您的评论,内容将类似于数组。 因此,您希望读取内容,对其进行过滤,并从该内容中获取结果行: # Get the content # $content

我有一个包含数百万条记录的文本文件 我想从每一行中找出不是以字符串+行号开头的行(字符串以双引号01/01/2019开头)

你能帮我修改这个代码吗

Get-Content "(path).txt" | Foreach { if ($_.Split(',')[-1] -inotmatch "^01/01/2019") { $_; } }

谢谢

根据您的评论,内容将类似于数组。 因此,您希望读取内容,对其进行过滤,并从该内容中获取结果行:

# Get the content

# $content = Get-Content -Path 'pathtofile.txt'
$content = @('field1,field2,field3', '01/01/2019,b,c') 

# Convert from csv
$csvContent = $content |  ConvertFrom-Csv 

# Add your filter based on the field
$results = $csvContent | Where-Object { $_.field1 -notmatch '01/01/2019'}  | % { $_ }

# Convert your results back to csv if needed
$results | ConvertTo-Csv
如果性能是一个问题,那么.net将以类似的方式处理数百万条记录


查看问题和评论,您似乎正在处理一个无标题的CSV文件。由于该文件包含数百万条记录,我认为使用
Get Content
Import Csv
可能会减慢太多速度。使用
[System.IO.File]::ReadLines()
会更快

如果确实每一行都以引用的日期开始,您可以使用各种方法确定该行是否以2019年1月1日开始。这里,我使用
-notlike
运算符:

$fileIn  = "D:\your_text_file_which_is_in_fact_a_CSV_file.txt"
$fileOut = "D:\your_text_file_which_is_in_fact_a_CSV_file_FILTERED.txt"

foreach ($line in [System.IO.File]::ReadLines($fileIn)) {
    if ($line -notlike '"01/01/2019*') {
        # write to a NEW file
        Add-Content -Path $fileOut -Value $line
    }
}

更新

从您的评论判断,您显然使用的是较旧的.NET框架,因为
[System.IO.File]::ReadLines()
从年开始可用

在这种情况下,以下代码应适用于您:

$fileIn  = "D:\your_text_file_which_is_in_fact_a_CSV_file.txt"
$fileOut = "D:\your_text_file_which_is_in_fact_a_CSV_file_FILTERED.txt"

$reader = New-Object System.IO.StreamReader($fileIn)
$writer = New-Object System.IO.StreamWriter($fileOut)
while (($line = $reader.ReadLine()) -ne $null) {
    if ($line -notlike '"01/01/2019*') {
        # write to a NEW file
        $writer.WriteLine($line)
    }
}
$reader.Dispose()
$writer.Dispose()

我的.txt文件如下所示

日期,第2列,第3列
“2019年1月1日22:42:00”、“第2栏”、“第3栏”
“2019年2月1日22:42:00”、“第2栏”、“第3栏”
“2019年1月1日22:42:00”、“第2栏”、“第3栏”
“2019年1月2日22:42:00”、“第2栏”、“第3栏”

此命令完全按照您的要求执行

Get-Content -Path C:\myFile.txt | ? {$_ -notmatch "01/01/2019"} | Select -Skip 1
输出为:

“2019年2月1日22:42:00”、“第2栏”、“第3栏”
“2019年1月2日22:42:00”、“第2栏”、“第3栏”


我跳过了顶行。如果您想处理特定列,请将myFile.txt更改为.csv并导入它。

提供一些
path.txt文件的示例以及我们正在查看的内容,以便我们可以查看您的代码是否可行。“(path).txt”我的意思是“喜欢”‪C:\Userssomeone\Desktop\script.ps1“文本文件只包含诸如“01/01/2019”、字段1、字段2等数据”查看内容的管道,这样您就不必在最后一行拆分您应该使用Where对象而不是foreach。你没有对每个对象做任何事情,你只是想从根本上过滤结果。您的文本文件内容实际上是什么样子的?谢谢,但不需要转换为csv,下面是我对脚本的一个问题:获取内容“C:\Users\Someone\Test.txt”|其中的对象{$\u.field1-不匹配“^01/01/2019”}我想查找此文件的每一行都不是以一月一日开始的结果。但不知怎的,我得到的结果是以一月一日开始的。请提供一些示例内容,因为我不知道您的数据是什么样子。每一行的内容都以“01/01/2019 22:42:13”、“Column2”开头,“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”、“Column2”等。但是,当将文本/^2019年1月1日{print;}您需要不匹配还是可以使用notlike<代码>@('field1,field2,field3','01/01/2019 22:42:13”,“Column2”,“Column2”,“Column2”,“”“,”,“,”)|?{$\u-不象'*01/01/2019*'}
?谢谢你的评论。你的脚本逻辑合理,你的思路正确。我想测试,但当我插入你的脚本时,我得到了“方法调用失败,因为[System.IO.File]不包含名为“ReadLines”的方法。“@slayers从.NET framework 4.0版开始,就可以使用
ReadLines
方法。如果您的版本低于该版本,我已经更新了我的答案,为您提供了一个替代方案。这不是小题大做,但我看不出这个脚本在做什么,我提供的本机Powershell one liner不是。我不认为有必要使用While循环和If语句,实际上所有杀戮者都被要求获得不包含特定日期的行。也许性能是个问题。但是杀戮者要求的结果在我的帖子中很容易做到。回应你对我答案的评论:对于一个问题有多个答案是很好的。此外,我在你之前发布了我的代码,并根据OPs评论添加了新代码。顺便说一句,您的答案要求文件具有OP注释为没有的列标题。此外,当使用
-notmatch
时,您需要注意,在其他列中也可能有日期,问题在于跳过第一列与2019年1月1日不同的行。如果没有锚定并包括第一个双引号,恐怕你的答案就会失败。嗨@Theo。再次强调,不要小气或暴躁。我确实提到了标题场景,如果slayers数据不包含标题,那么使用Get Content就可以了。slayer向我描述的数据在其他列中不包含日期。我问它看起来像什么,这就是他们描述的。将我的建议改为使用-notlike“01/01/2019*”,如果您愿意,如果数据如所述,它也会这样做。我也不明白杀戮者说哪里没有头球。这段摘录自他们下面评论的内容可能会提出其他建议……”Where Object{$\.field1-notmatch'^01/01/2019'}@Theo无论如何,使用.NET对象和所有对象都很好。谢谢你对社区的帮助。祝你过得愉快!谢谢,虽然OP状态文本文件的第二条评论仅包含“01/01/2019”、字段1、字段2等数据。关于他让我们对其他列中的内容一无所知,你是对的,所以安全比抱歉好,你不认为吗?是的,但他也使用了“…$\字段1…”。。。“在此上下文中,它将是列名/标题。是的,安全总比后悔好。我的观点是,这可以通过一个简单的一行来实现,我看到了rela
Get-Content -Path C:\myFile.txt | ? {$_ -notmatch "01/01/2019"} | Select -Skip 1