Застрял с этим сценарием PS - PullRequest
0 голосов
/ 20 мая 2019

У меня есть текстовый файл, содержащий миллионы записей, которые я хочу найти в каждой строке, которая не начинается со строки + этот номер строки (строка начинается с двойной кавычки 01.01.2009)

МожетВы помогаете мне изменить этот код?

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

Глядя на вопрос и комментарии, вы, похоже, имеете дело с 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 Framework,[System.IO.File]::ReadLines() стало доступно начиная с версии 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()
0 голосов
/ 21 мая 2019

Мой .txt файл выглядит так ...

* 1003 Дата *, col2, col3
"01.01.2009 22:42:00", "column2", "column3"
"01/02/2019 22:42:00", "column2", "column3"
"01.01.2009 22:42:00", "column2", "column3"
"01.02.2009 22:42:00", "column2", "column3"

Эта команда делает именно то, что вы просите ...

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

Вывод:

"02.01.2009 22:42:00", "column2", "column3"
"01.02.2009 22:42:00", "column2", "column3"

Я пропустил верхний ряд. Если вы хотите работать с определенными столбцами, измените myFile.txt на .csv и импортируйте его.

0 голосов
/ 20 мая 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 будет обрабатывать миллионы записей с CsvHelper точно так же, как PowerBi .

# 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...