Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск и удаление дублей в csv-файле (http://forum.oszone.net/showthread.php?t=211425)

IvanXXL 19-07-2011 07:40 1715386

Поиск и удаление дублей в csv-файле
 
Доброго времени суток!

Прошу подсказать решение для следующей задачи:
Есть csv-файл примерно такого содержания:
Код:

Иванов;Иван;Иванович;легковой автомобиль;Тойота Камри;а256км
Петров;Петр;Петрович;грузовой автомобиль;Форд Транзит;о678оо
Сидоров;Сидор;Сидорович;грузовой автомобиль;Тойота Дюна;р643тр
Васильев;Василий;Васильевич;легковой автомобиль;Ниссан Алмера;в214тн

Необходимо оставить в файле только уникальные записи для условия: тип автомобиля и фирма-производитель без учета модели автомобиля, т.е., например, если в файле есть несколько записей о грузовых автомобиля Тойота, то все эти записи надо удалить или же есть несколько легковых автомобилей Форд - то же удалить.

amel27 19-07-2011 11:53 1715536

Цитата:

Цитата 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 19-07-2011 12:24 1715555

Скрипт работает, но не совсем так, как хотелось - удалению подлежат все дублирующиеся записи, т.е., например, если по условию "грузовой автомобиль Тойота" найден(ы) дубликат(ы), то удалению подлежат все записи с условием "грузовой автомобиль Тойота". Таким образом после работы скрипта в файле должны остаться записи, изначально не имевшие дублей.

amel27 19-07-2011 13:04 1715600

Цитата:

Цитата 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"


IvanXXL 19-07-2011 13:14 1715610

Спасибо. Это именно то, что требовалось.


Время: 13:24.

Время: 13:24.
© OSzone.net 2001-