Переменная $getErrorCodes имеет много кодов ошибок.
Поскольку я хочу удалить строки, везде, где код ошибки присутствует в файле csv. мой код работает, как и ожидалось, но он слишком медленный, для транзакции 60000 csv требуется около 10 минут.
getErrorCodes = {100 101 103}
csv file( 3 columns)
========
100|102|104
110|103|109
107|108|109
107|108|109
Мой код
Get-Content $CSVFile | Where-Object {($_.ToString().Split(",")[0] -notin $getErrorCodes) -and ($_.ToString().Split(",")[1] -notin $getErrorCodes)-and ($_.ToString().Split(",")[2] -notin $getErrorCodes)} | Out-File "resultfile.csv"
очень признателен, если вы можете предоставить любое другое решение.
Import-CSV тоже медленный, вот мой код Import-Csv $CSVFile -Header A1,A2,A3 | Where-Object {($_.A1 -notin $getErrorCodes)} | Экспорт-CSV "aa.csv"
Используйте Import-Csv / Export-Csv и HashTable или HashSet , которые оптимизированы для бинарного поиска:
$ErrorCodes = [System.Collections.Generic.HashSet[String]](100,101,103)
Import-Csv $CSVFile -Header (1..3) | Where-Object {
!($ErrorCodes.Contains($_.1)) -and
!($ErrorCodes.Contains($_.2)) -and
!($ErrorCodes.Contains($_.3))
} | Export-Csv .\resultfile.csv -UseQuotes Never
Примечание: если вы хотите удалить заголовок из результатов, вы можете сделать что-то вроде:
... | ConvertTo-Csv | Select-Object -skip 1 | Set-Content .\resultfile.csv
Спасибо за ответ, у меня нет заголовка в моем CSV, поэтому я получаю сообщение об ошибке. я бы прочитал файл из строки номер 1, также в моем файле есть повторяющиеся значения в первой строке. Строка 1 > 101 | 101 | 101 Ряд2 > 102 | 102 | 102, поэтому я не мог использовать import-csv.
В чем ошибка? Также, если вы просто вставите точный минимальный воспроизводимый пример (от -Header (1..3)
вверх и до -UseQuotes Never
), который я создал выше? Если да, то какую версию PowerShell вы используете? К вашему сведению, параметр -Header (1..3)
будет читать CSV без заголовков (и вместо этого использовать заголовки от 1
до 3
.
Я поставил заголовок по умолчанию как «Import-Csv $CSVFile -Delimiter ',' -Header «Letter1», «Letter2», «Letter3»», теперь он работает. Большое спасибо. Теперь я получаю другую ошибку «Где-объект: не удается проверить аргумент параметра« Свойство ». Аргумент имеет значение null или пуст. Укажите аргумент, который не является нулевым или пустым, а затем повторите команду». Мой код - Import-Csv $CSVFile -Header "Letter1", "Letter2", "Letter3" | Where-Object $_."Letter1" -NotMatch $getErrorCodes | Внешний файл "test.csv"
Пожалуйста, примите ответ и создайте новый вопрос для любых новых вопросов.
Спасибо за вашу своевременную поддержку.
Привет @iRon, исправлена ошибка, у меня не фиксированные столбцы csv, и я бы сравнил только с первым столбцом, но я хочу отобразить всю строку. Import-Csv $CSVFile -Header col1 | Where-Object {!($getErrorCodes.Contains($_.col1)) } | Export-Csv "resultfile.csv" Не могли бы вы мне помочь?
Попробуйте
Import-CSV
затем обработайте полученный объект и экспортируйте его, когда закончите.