Powershell: сортировка / удаление дубликатов в файле CSV - PullRequest
2 голосов
/ 15 февраля 2012

Прежде всего, я очень новичок в Powershell, и я хотел бы поблагодарить всех участников этого сайта за помощь, предоставив ответы в разных сферах! Благодаря этому сайту я многого достиг за короткое время!

Вот проблема, и я сделаю все возможное, чтобы объяснить. У меня есть файл CSV для создания учетных записей студентов. Наша система управления студентами производит запись каждый раз, когда студент регистрируется, изменяется или выходит из программы. Если этот ученик «опробует» несколько разных программ, он будет иметь несколько записей в файле CSV. Поэтому моя цель - отсортировать файл CSV по идентификатору пользователя (идентификатор пользователя никогда не изменяется) и по CurrentStatusDate (когда создавалась запись). Используя эту команду:

Import-CSV "C:\students.csv" | sort UserID,CurrentStatusDate

Образец записей CSV:

"UserID","AccountStatus","PersonID","PIN","FirstName","LastName","IDEXPIRY","Term","Role","Course","SectionName","locationDescription","Location","CurrentStatusDate"
"aboggs","Add","xxxxxxx","xxxxxxx","Ashley","Baggs","5/11/2013","xxxxxx","Student","Accounting Technology","xxxxxx","xxxxxx","xxxxxx","9/12/2011"
"aboutilier","Add","xxxxxxx","xxxxxxx","Amelia","Boutilier","5/3/2012","xxxxxx","Student","Adult Education","xxxxxx","xxxxxx","xxxxxx","11/15/2011"
"abowtle","Delete","xxxxxxx","xxxxxxx","Aleisha","Bowtle","7/31/2013","xxxxxx","Student","Business Administration","xxxxxx","xxxxxx","xxxxxx","2/1/2011"
"abowtle","Add","xxxxxxx","xxxxxxx","Aleisha","Bowtle","7/31/2012","xxxxxx","Student","General Studies","xxxxxx","xxxxxx","xxxxxx","9/9/2011"
"abradley","Delete","xxxxxxx","xxxxxxx","Anna","Bradley","10/25/2011","xxxxxx","Student","Adult Education","xxxxxx","xxxxxx","xxxxxx","11/17/2011"
"abridges","Delete","xxxxxxx","xxxxxxx","Ashley","Bridges","10/5/2011","xxxxxx","Student","Adult Education","xxxxxx","xxxxxx","xxxxxx","11/15/2011"
"abrown10165","Add","xxxxxxx","xxxxxxx","Adam","Brown","10/28/2011","xxxxxx","Student","Advanced Firefighting STCW VI/3","xxxxxx","xxxxxx","xxxxxx","10/24/2011"
"abrown10165","Add","xxxxxxx","xxxxxxx","Adam","Brown","12/16/2011","xxxxxx","Student","Simulated Electronic Navigation Level 1, Part B","xxxxxx","xxxxxx","xxxxxx","11/10/2011"
"abrown8081","Add","xxxxxxx","xxxxxxx","Alex","Brown","5/25/2013","xxxxxx","Student","Culinary Arts","xxxxxx","xxxxxx","xxxxxx","9/6/2011"
"abrown8950","Delete","xxxxxxx","xxxxxxx","Ashley","Brown","9/13/2012","xxxxxx","Student","Medical Support Services","xxxxxx","xxxxxx","xxxxxx","9/14/2011"
"acameron2637","Delete","xxxxxxx","xxxxxxx","Anne","Cameron","10/14/2011","xxxxxx","Student","Adult Education","xxxxxx","xxxxxx","xxxxxx","10/14/2011"
"acameron4368","Add","xxxxxxx","xxxxxxx","Amanda","Cameron","4/20/2013","xxxxxx","Student","Applied Degree in Culinary Operations","xxxxxx","xxxxxx","xxxxxx","10/12/2011"
"acampbell10266","Add","xxxxxxx","xxxxxxx","Amanda","Campbell","5/4/2012","xxxxxx","Student","Adult Education","xxxxxx","xxxxxx","xxxxxx","11/7/2011"
"acampbell6499","Delete","xxxxxxx","xxxxxxx","Aaron","Campbell","10/31/2012","xxxxxx","Student","Retail Business Management","xxxxxx","xxxxxx","xxxxxx","11/1/2011"
"acampbell6499","Add","xxxxxxx","xxxxxxx","Aaron","Campbell","12/13/2011","xxxxxx","Student","Complete the Accounting Cycle - Part II","xxxxxx","xxxxxx","xxxxxx","9/26/2011"

Это должно сгруппировать все идентификаторы пользователя с одинаковыми записями, а затем отсортировать их по дате создания. Затем я хочу удалить дубликаты и сохранить последнюю созданную запись. Я знаком с параметром -Unique, но он не относится к приведенной выше команде, поскольку он будет удалять только записи с дублирующимися идентификаторами userID и CurrentStatusDates.

Если я "гуглюсь" и бьюсь по голове 2 дня ... начинаю думать, что нет "легкого" ответа, но у меня слабое программирование ... Просто ищу "толчок" в правильное направление.

Спасибо!

Chris

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Как сказал Энди, это немного сложно, учитывая, что у нас нет образца формата CSV.Однако я думаю, что вам нужно что-то похожее на приведенное ниже:

Import-CSV "C:\students.csv" | Group-Object userid | foreach-object { $_.group | sort-object currentstatusdate | select -last 1}

Как вы и описали - мы группируем по ID, затем сортируем по CurrentStatusDate, затем выбираем самую последнюю запись.Я не уверен, как отформатирован CurrentStatusDate, поэтому я не знаю, будет ли достаточно хороший объект сортировки.

0 голосов
/ 15 февраля 2012

Не тестировалось:

 $new_csv = @()
 Import-CSV "C:\students.csv" | sort UserID |
  foreach {
    if ($temp -eq $null){$temp = $_}
    if ($_.UserID -ne $temp.UserID){
       $new_csv += $temp
       $temp = $_
       }
elseif ([datetime]$_.CurrentStatusDate -gt [datetime]$temp.CurrentStatusDate){
   $temp = $_
   }
 } 
 $new_csv += $temp
 export-csv $new_csv c:\somedir\new_csv.csv -notype

Когда появится первая запись, $ temp будет установлена ​​на эту запись. По мере поступления каждой новой записи, если она для одного и того же студенческого идентификатора, отметка времени проверяется снова в записи в $ temp. Если он новее, он помещается в $ temp. Когда он видит изменение userID, он записывает $ temp (который теперь должен содержать самую новую запись для последнего пользователя) в $ new_csv. Затем он устанавливает $ temp для текущей записи и начинает заново для следующего идентификатора пользователя. Так как он не увидит изменения идентификатора пользователя для последней учетной записи, вы должны выбрать его после завершения цикла, а затем экспортировать CSV.

Не знаю точно, в каком формате находится эта временная метка, но я предполагаю, что она будет правильно обрабатываться до [datetime]. Но если он исходит из .csv, то это будет строка, и казалось маловероятным, что она будет сортироваться по порядку даты и времени при сортировке строк, поэтому я даже не стал возиться.

0 голосов
/ 15 февраля 2012

Как насчет:

...