PDA

Показать полную графическую версию : [решено] Поиск и удаление дублей в csv-файле


IvanXXL
19-07-2011, 07:40
Доброго времени суток!

Прошу подсказать решение для следующей задачи:
Есть csv-файл примерно такого содержания:
Иванов;Иван;Иванович;легковой автомобиль;Тойота Камри;а256км
Петров;Петр;Петрович;грузовой автомобиль;Форд Транзит;о678оо
Сидоров;Сидор;Сидорович;грузовой автомобиль;Тойота Дюна;р643тр
Васильев;Василий;Васильевич;легковой автомобиль;Ниссан Алмера;в214тн
Необходимо оставить в файле только уникальные записи для условия: тип автомобиля и фирма-производитель без учета модели автомобиля, т.е., например, если в файле есть несколько записей о грузовых автомобиля Тойота, то все эти записи надо удалить или же есть несколько легковых автомобилей Форд - то же удалить.

amel27
19-07-2011, 11:53
оставить в файле только уникальные записи для условия: тип автомобиля и фирма-производитель без учета модели »
$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
19-07-2011, 12:24
Скрипт работает, но не совсем так, как хотелось - удалению подлежат все дублирующиеся записи, т.е., например, если по условию "грузовой автомобиль Тойота" найден(ы) дубликат(ы), то удалению подлежат все записи с условием "грузовой автомобиль Тойота". Таким образом после работы скрипта в файле должны остаться записи, изначально не имевшие дублей.

amel27
19-07-2011, 13:04
удалению подлежат все дублирующиеся записи »
$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"

IvanXXL
19-07-2011, 13:14
Спасибо. Это именно то, что требовалось.




© OSzone.net 2001-2012