Оптимизация файловой версии на основе Powershell - PullRequest
2 голосов
/ 26 июля 2011

Итак, в настоящее время у меня есть группа CSV-файлов, которые я прочесываю и заменяю различные части использования powershell. Однако текущий процесс, который я использую, требует очень много времени, и мне было интересно, есть ли лучшее, более рациональное решение.

Текущий код: (Это все содержится в a для каждого цикла, где $ file - это местоположение файла, а $ tb - это имя таблицы) *

Invoke-sqlcmd -query "select Distinct * from $($tb.name) WITH (NoLock)" -server server -database database | Export-CSV $file -Delimiter "|" -Encoding "Unicode" -NoTypeInformation
(get-content $file) -replace '"?\|"?', "|" | out-file $file
(get-content $file) -replace '\|true\|', '|1|' | out-file $file
(get-content $file) -replace '\|false\|', '|0|' | out-file $file
(get-content $file) -replace '^"' | out-file $file
(get-content $file) -replace '"$' | out-file $file
(get-content $file) -replace '^true\|', '1|' | out-file $file
(get-content $file) -replace '^false\|', '0|' | out-file $file
(get-content $file) -replace 'true$', '1' | out-file $file
(get-content $file) -replace 'false$', '0' | select -Skip 1 | out-file $file
(get-content $file) -replace '\|false\|', '|0|' | out-file $file
}

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Upvoted ответ @EBGreen, это, вероятно, решение.Просто чтобы показать вам, как это сделать (и как связать операторы), я добавлю код:

Invoke-SqlCmd...
(get-content $file) -replace '"?\|"?', "|" `
                    -replace '\|true\|', '|1|'`
...
                    -replace '\|false\|', '|0|' | out-file $file

Кроме того, рассмотрите возможность замены перед тем, как экспортировать данные в формате csv.Вы можете просмотреть коллекцию из Invoke-SqlCmd и заменить соответствующие значения свойств.Также подумайте, если бы простая замена true на 1 и false на 0 удалила бы большинство регулярных выражений.

3 голосов
/ 26 июля 2011

Первое и самое очевидное, что я вижу, это то, что вы загружаете файл с диска и записываете его обратно при каждой замене.Первая оптимизация, которую я бы сделал, - это загрузить файл в память один раз, выполнить все замены в памяти, а затем записать его обратно на диск.

Что-то вроде:

$contents = (get-content $file) -replace '"?\|"?', "|"
$contents = $contents -replace '\|true\|', '|1|'
e
t
c
.
.
.
$contents | out-file $file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...