Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
CREATE TRANCODE MPF OF TXOLID
AGENDA = T4XCLCSHINAG
,ANY_SC_LIST = NONE ,EVERY_SC_LIST = NONE
,SECURITY_CATEGORY = NONE ,FUNCTION = 14
,TRANCODE_VALUE = "MPF"
,TRANCODE_FUNCTION_MNEMONIC = NONE
,INSTALLATION_DATA = NONE
;
Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
rv Start,Filtered,count,CSV
Write-Host "Reading Mainframe Extract File"
$Start = gc K:\TRANCODES.txt
Write-Host ("Read Complete : " + $Start.Count + " records found")
Write-Host "Filtering records for AGENDA/TRANCODE information"
$Filtered = $Start|Select-String -Pattern "AGENDA","TRANCODE_VALUE"
Write-Host ([String]($Filtered.Count/2) + " AGENDA/TRANCODE pairs found")
Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
AGENDA = T4XCLCSHINAG
,TRANCODE_VALUE = "MPF"
AGENDA = T4XCLCSHINAG
,TRANCODE_VALUE = "MP"
Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
Measure-Command{$Filtered|foreach {If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
Measure-Command{$Filtered|foreach {If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
rv Start,Filtered,count,CSV
Write-Host "Reading Mainframe Extract File"
$Start = gc K:\TRANCODES.txt
Write-Host ("Read Complete : " + $Start.Count + " records found")
Write-Host "Filtering records for AGENDA/TRANCODE information"
$Filtered = $Start|Select-String -Pattern "AGENDA","TRANCODE_VALUE"
Write-Host ([String]($Filtered.Count/2) + " AGENDA/TRANCODE pairs found")
Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$Filtered|foreach {If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
Reading Mainframe Extract File
Read Complete : 94082 records found
Filtering records for AGENDA/TRANCODE information
11759 AGENDA/TRANCODE pairs found
Building table from the filter results
Table built : 11759 rows created
Sorting and Exporting table to CSV file
TotalSeconds : 75.2279182
РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$Filtered|foreach {If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString() -Match 'AGENDA'){$obj = $null;
$obj = New-Object System.Object;
$obj | Add-Member -type NoteProperty -name AGENDA -Value Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString().SubString(27)}
If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString() -Match 'TRANCODE_VALUE'){$obj | Add-Member -type NoteProperty -name TRANCODE -Value ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString().SubString(28)).Replace('"','');
$CSV += $obj;
$obj = $null}
$count++
If ($sw.Elapsed.TotalMilliseconds -ge 500) {
Write-Progress `
-Activity "Building table of values from filter results" `
-Status ("Processed " + $count + " of " + $Filtered.Count + " records") `
-Id 1 `
-PercentComplete ([int]($count/$Filtered.Count *100));
$sw.Reset();
$sw.Start()}
}
Write-Progress `
-Activity "Building table of values from filter results" `
-Status ("Table built : " + $CSV.Count + " rows created") `
-Id 1 `
-Completed
И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString() -Match 'AGENDA'){$obj = $null;
$obj = New-Object System.Object;
$obj | Add-Member -type NoteProperty -name AGENDA -Value Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
Reading Mainframe Extract File
Read Complete : 94082 records found
Filtering records for AGENDA/TRANCODE information
11759 AGENDA/TRANCODE pairs found
Building table from the filter results
Table built : 11759 rows created
Sorting and Exporting table to CSV file
TotalSeconds : 75.2279182
РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$Filtered|foreach {If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString() -Match 'AGENDA'){$obj = $null;
$obj = New-Object System.Object;
$obj | Add-Member -type NoteProperty -name AGENDA -Value Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString().SubString(27)}
If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString() -Match 'TRANCODE_VALUE'){$obj | Add-Member -type NoteProperty -name TRANCODE -Value ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString().SubString(28)).Replace('"','');
$CSV += $obj;
$obj = $null}
$count++
If ($sw.Elapsed.TotalMilliseconds -ge 500) {
Write-Progress `
-Activity "Building table of values from filter results" `
-Status ("Processed " + $count + " of " + $Filtered.Count + " records") `
-Id 1 `
-PercentComplete ([int]($count/$Filtered.Count *100));
$sw.Reset();
$sw.Start()}
}
Write-Progress `
-Activity "Building table of values from filter results" `
-Status ("Table built : " + $CSV.Count + " rows created") `
-Id 1 `
-Completed
И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString().SubString(27)}
If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
Reading Mainframe Extract File
Read Complete : 94082 records found
Filtering records for AGENDA/TRANCODE information
11759 AGENDA/TRANCODE pairs found
Building table from the filter results
Table built : 11759 rows created
Sorting and Exporting table to CSV file
TotalSeconds : 75.2279182
РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$Filtered|foreach {If ( Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного файла:
[110] Теперь для каждого из них я забочусь только о значениях AGENDA
и TRANCODE_VALUE
, поэтому прочитал файл в Get-Content
, затем я использую Select-String
как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:
[111] Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo
с содержимое вроде:
[112] Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.
Однако следующий шаг, захват фактических значений (после =
) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress
полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command
:
[113] Так что это 717.2308630680085 записей / сек
[114] Сейчас только ничтожные 89,98660799693897 записей / с
Есть идеи, как повысить эффективность?
Вот полный сценарий как есть:
[115] Вот вывод из сценария с write-progress
прокомментировал:
[116] РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:
[117] И выполнение всего скрипта через Measure-Command
дает истекшее время 75,2279182 секунды без write-progress
и с измененным write-progress
с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)
.ToString() -Match 'AGENDA'){$obj = $null;
$obj = New-Object System.Object;
$obj | Add-Member -type NoteProperty -name AGENDA -Value Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string
), а затем сканирует массив MatchInfo
, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.
Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress
, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.
Вот пример записи из исходного фай