我有一个包含数百万条记录的文本文件 我想从不是以字符串+该行号开头的每一行中找出(字符串以双引号01/01/2019开头)
您能帮我修改此代码吗?
Get-Content "(path).txt" | Foreach { if ($_.Split(',')[-1] -inotmatch "^01/01/2019") { $_; } }
谢谢
答案 0 :(得分:0)
根据您的评论,内容将类似于数组。 因此,您想阅读内容,对其进行过滤并从该内容中获取结果行:
{
"message": "API rate limit exceeded for 116.73.235.229. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)",
"documentation_url": "https://developer.github.com/v3/#rate-limiting"
}
如果性能成为问题,那么.net将像CsvHelper一样使用PowerBi处理数百万条记录。
# 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
答案 1 :(得分:0)
看着问题和评论,您正在处理的似乎是无标题的CSV文件。因为文件包含数百万条记录,所以我认为使用Get-Content
或Import-Csv
可能会减慢速度。这样,使用[System.IO.File]::ReadLines()
就会更快。
如果确实每一行都以引号引起来,则可以使用各种方法来确定行是否以"01/01/2019
开头。在这里,我使用-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()
从version 4.0开始可用。
在这种情况下,以下代码应为您工作:
$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()
答案 2 :(得分:0)
我的.txt文件如下所示...
日期,col2,col3
“ 01/01/2019 22:42:00”,“ column2”,“ column3”
“ 01/02/2019 22:42:00”,“ column2”,“ column3”
“ 01/01/2019 22:42:00”,“ column2”,“ column3”
“ 02/01/2019 22:42:00”,“ column2”,“ column3”
此命令完全符合您的要求...
Get-Content -Path C:\myFile.txt | ? {$_ -notmatch "01/01/2019"} | Select -Skip 1
输出为:
“ 01/02/2019 22:42:00”,“ column2”,“ column3”
“ 02/01/2019 22:42:00”,“ column2”,“ column3”
我跳过了第一行。如果要处理特定的列,请将myFile.txt更改为.csv并导入。