Поиск и удаление дублей в csv-файле
Доброго времени суток!
Прошу подсказать решение для следующей задачи:
Есть csv-файл примерно такого содержания:
Код:
Иванов;Иван;Иванович;легковой автомобиль;Тойота Камри;а256км
Петров;Петр;Петрович;грузовой автомобиль;Форд Транзит;о678оо
Сидоров;Сидор;Сидорович;грузовой автомобиль;Тойота Дюна;р643тр
Васильев;Василий;Васильевич;легковой автомобиль;Ниссан Алмера;в214тн
Необходимо оставить в файле только уникальные записи для условия: тип автомобиля и фирма-производитель без учета модели автомобиля, т.е., например, если в файле есть несколько записей о грузовых автомобиля Тойота, то все эти записи надо удалить или же есть несколько легковых автомобилей Форд - то же удалить.
|
Цитата:
Цитата IvanXXL
оставить в файле только уникальные записи для условия: тип автомобиля и фирма-производитель без учета модели »
|
Код:
$file="file.csv"
$temp="temp.csv"
Type $file|Out-File $temp -Encoding "Unicode"
$header = "Family","Name1","Name2","Type","Model","ID"
$csv = Import-CSV $temp -header $header -delimiter ";"
$out = @{}
$csv | ForEach-Object {
$id = $_.Type +";"+ $_.Model.Split(" ")[0]
$line = $_.Family +";"+ $_.Name1 +";"+ $_.Name2 +";"+ $_.Type +";"+ $_.Model +";"+ $_.ID
$out[$id]=$line
}
$out.Values | Out-File $file -Encoding "Default"
|
Скрипт работает, но не совсем так, как хотелось - удалению подлежат все дублирующиеся записи, т.е., например, если по условию "грузовой автомобиль Тойота" найден(ы) дубликат(ы), то удалению подлежат все записи с условием "грузовой автомобиль Тойота". Таким образом после работы скрипта в файле должны остаться записи, изначально не имевшие дублей.
|
Цитата:
Цитата IvanXXL
удалению подлежат все дублирующиеся записи »
|
Код:
$file="file.csv"
$out = @{};$del = @{}
Type $file | ForEach-Object {
$list = $_.Split(";")
$id = $list[3] +";"+ $list[4].Split(" ")[0]
If ($out.ContainsKey($id)) {$del[$id]+=1}
$out[$id]=$_.ToString()
}
$out.Keys | ForEach-Object {
If (!$del.ContainsKey($_.ToString())) {$out[$_.ToString()]}
} | Out-File $file -Encoding "Default"
|
Спасибо. Это именно то, что требовалось.
|
Время: 13:24.
© OSzone.net 2001-