none
Проблемы с Compare-Object PowerShell RRS feed

  • Вопрос

  • Добрый день.

    Нужно сравнить два набора объектов и вывести только те которых нет в эталоне. Результат очень странный, в выводе имеются одни и те же записи с разными SideIndecator'ами. Он пишет что такой элемент есть в обоих наборах объектов и что этот же элемент есть только в одном из них, это как? В итоге результат сравнения неверный. Что может быть не так? 


Ответы

  • Compare-Object (gc 1.csv) (gc 2.csv)
    • Помечено в качестве ответа SteFFun 28 мая 2013 г. 6:18
    Отвечающий
  • Проблема в том, что Compare-Object видимо не умеет сравнивать экземпляры PSCustomObject, которые получаются при импортировании CSV, и просто считает их равными. Поэтому Вам надо либо сравнивать строки, как предложил Kazun, либо явно указывать свойства объектов для сравнения:
    $1=Import-Csv 1.csv -Delimiter ';' -Encoding Default
    $2=Import-Csv 2.csv -Delimiter ';' -Encoding Default
    Compare-Object $1 $2 -Property $1[0].PSObject.Properties.Name
    • Помечено в качестве ответа SteFFun 28 мая 2013 г. 6:18

Все ответы

  • Один элемент может повторятся более одного раза в некотором наборе:
    Compare-Object 1,1 1 -IncludeEqual
  • Просмотрел и проверил нет повторений ни в одном из наборов. Какие еще могут быть варианты?
  • Какие данные сравниваете? Пример  приведите.

    Отвечающий
  • Сравниваю два массива с объектами. Массивы получены из CSV путем импорта с разделителем ";". Могу в принципе кинуть эти 2 файла.

    Вот пример содержимого одного объекта

    STCD1      : 4703075409
    STCD3      : 470301001
    COUNTRY    : RU
    NAME1      : ООО "Хост СПб"
    NAME2      : ООО "Хост СПб"
    NAME3      : Хост СПб
    NAME4      : Общество с ограниченной ответственность
    CITY1      : Всеволожск г
    POST_CODE1 : 188643
    TEL_NUMBER : 
    FAX_NUMBER : 
    STREET     : Сергиевская ул
    HOUSE_NUM1 : 000112
    SORT1      : 4703075409
    SORT2      : получатель счета
    LIFNR      : 000079
    STCD2      : 61057882
    BANKS      : RU
    BANKL      : 44030804
    BKONT      : 000040
    BANKN      : 40702810100001100000

    • Изменено SteFFun 27 мая 2013 г. 12:48
  • Прикрепите оба файла и какой требуется конечный результат. Если сравнение идет только по нескольким свойствам,то можно указать параметр -Property.

    Отвечающий
  • Сравнить содержимое файла 1 с файлом 2 и вывести все записи которых нет в файле 2, но есть в файле 1. У меня при сравнение по всем свойствам неверный результат, однако при сравнении по некоторым свойствам все в порядке. 

    ссылка

    http://files.mail.ru/FCB1E2B543604B53806ED48F301816C7

  • Compare-Object (gc 1.csv) (gc 2.csv)
    • Помечено в качестве ответа SteFFun 28 мая 2013 г. 6:18
    Отвечающий
  • Проблема в том, что Compare-Object видимо не умеет сравнивать экземпляры PSCustomObject, которые получаются при импортировании CSV, и просто считает их равными. Поэтому Вам надо либо сравнивать строки, как предложил Kazun, либо явно указывать свойства объектов для сравнения:
    $1=Import-Csv 1.csv -Delimiter ';' -Encoding Default
    $2=Import-Csv 2.csv -Delimiter ';' -Encoding Default
    Compare-Object $1 $2 -Property $1[0].PSObject.Properties.Name
    • Помечено в качестве ответа SteFFun 28 мая 2013 г. 6:18
  • Ребята, какие Вы умные, чтоб я без Вас делал! Спасибо! =) Все правильно отрабатывает в обоих способах.