我有一个文本文件,其中包含数百万条记录,我想从不是以字符串+行号开头的每一行中查找(字符串以双引号01/01/2019开头)
你能帮我修改这段代码吗?
Get-Content "(path).txt" | Foreach { if ($_.Split(',')[-1] -inotmatch "^01/01/2019") { $_; } }
谢谢
发布于 2019-05-20 10:56:20
根据您的注释,内容将类似于数组。因此,您希望读取内容,对其进行过滤,并从该内容中获得结果行:
# 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将像PowerBi一样使用CsvHelper处理数以百万计的记录。
# install CsvHelper
nuget install CsvHelper
# import csvhelper
import-module CsvHelper.2.16.3.0\lib\net45\CsvHelper.dll
# write the content to the file just for this example
@('field1,field2,field3', '01/01/2019,b,c') | sc -path "c:\temp\text.csv"
$results = @()
# open the file for reading
try {
$stream = [System.IO.File]::OpenRead("c:\temp\text.csv")
$sr = [System.IO.StreamReader]::new($stream)
$csv = [CsvHelper.CsvReader]::new($sr)
# read in the records
while($csv.Read()){
# add in the result
$result= @{}
[string] $value = "";
for($i = 0; $csv.TryGetField($i, [ref] $value ); $i++) {
$result.Add($i, $value);
}
# add your filter here for the results
$results.Add($result)
}
# dispose of everything once we are done
}finally {
$stream.Dispose();
$sr.Dispose();
$csv.Dispose();
}
https://stackoverflow.com/questions/56213391
复制相似问题