Scripting Games 2009, Advanced Events 1, 2, 3

Scripting Games 2009 еще не начались, но первые вопросы уже публикуются. Учитывая что на этот раз соревнования “кто решит раньше не подглядывая” нет, то можно публиковать и решения. Это сделано из за того основной смысл этих игр не победа, а участие🙂 Ведь главное получить удовольствие и научиться чему то новому. И если вы позаимствуете красивый элемент у другого участника – это только к лучшему🙂

Итак, мои решения первых задачек из категории Advanced🙂

Event 1:

Первое задание на удивление простое… Даже неинтересно🙂

Получаем содержимое файла, отбираем непустые строки, сортируем по длинне, показываем первые 3:

gc '.\Personal Information Cards_ADV1.txt' | where {$_.trim()} | sort length | select -first 3

Event 2:

Тут всё было гораздо сложнее… Так как в MS Office уже на протяжении многих версий существует досадная бага, сильно осложняющая использование Excel из скриптов, я решил поступить проще: сконвертировать .xls файл в csv, обработать данные, и сконвертировать результат обратно в xls. В процессе столкнулся еще с некоторыми проблемами, но успешно их преодолел🙂

#Предполагается что файлы находятся в каталоге c:\scripts, и текущим каталогом PowerShell является он же.            
cd c:\scripts            
#Конвертируем xls в удобный csv            
$excel = New-Object -com excel.application            
$book = $excel.Workbooks.Open("c:\scripts\LongJump_Adv2.xls")            
$book.SaveAs("c:\scripts\LongJump_Adv2.csv",6)            
$excel.DisplayAlerts = $false            
$excel.quit()            
            
#Импортируем данные из csv            
$data = Import-Csv .\LongJump_Adv2.csv -delim ";"            
            
#Обрабатываем данные...            
foreach ($i in $data){            
    #Вычисляем лучший результат за последнюю встречу...            
    #Так как в русской локали разделителем десятичных знаков служит точка, а в файле запятая - мне пришлось использовать -replace            
    $i.result = $i."Jump 1",$i."Jump 2",$i."Jump 3" -replace 'x','0' -replace ',','.' | sort {[int]$_} | select -last 1            
    #Так как упомянутое в задании season average score в файле отсутствует,             
    #я решил сравнить результат в стречи с Personal Best            
    switch ([int]$i.result)            
    {            
        #Обратите внимание, в имени свойства 'Exceed/Achieve/Under Perform ' в конце затесался пробел...            
        #Мне пришлось немало повозиться прежде чем я это заметил🙂            
        {$_ -eq ($i."Personal Best" -replace ',','.')} {$i.'Exceed/Achieve/Under Perform ' = "Achieve"}            
        {$_ -lt ($i."Personal Best" -replace ',','.')} {$i.'Exceed/Achieve/Under Perform ' = "Under Perform"}            
        {$_ -gt ($i."Personal Best" -replace ',','.')} {$i.'Exceed/Achieve/Under Perform ' = "Exceed"}            
    }            
    #Меняем точку на запятую, чтобы не отличалось от остальных столбцов в файле.            
    $i.result = $i.result -replace '\.',','            
}            
#Выводим лучшего участника по результатам последней встречи            
$data | sort lastmeetbest | select -last 1            
#Сортируем по 'Exceed/Achieve/Under Perform '            
$data = $data | sort 'Exceed/Achieve/Under Perform '            
#и выводим результат в Csv файл.            
$data | Export-Csv "LongJump_Adv2_Final.csv" -Delimiter ';' -NoTypeInformation            
            
#Конвертируем csv в требуемый xls            
$excel = New-Object -com excel.application            
$book = $excel.WorkbookS.Open("c:\scripts\LongJump_Adv2_Final.csv")            
$book.SaveAs("c:\scripts\LongJump_Adv2_Final.xls",1)            
$excel.DisplayAlerts = $false            
$excel.quit()

Подозреваю что даже если бы я работал напрямую в Excel, используя workaround для этой баги, то всё равно получилось бы короче и красивее🙂

Event 3:

Третья задачка была гораздо легче, и приятнее🙂 С помощью моих любимых регулярных выражений, я решил её минут за 5🙂

gc .\Wordlist_ADV3.txt | ?{$_ -replace '[^AEIOUWY]' -match '^(.)\1*$'}

Присоединяйтесь!🙂 Узнать как постить свои скрипты на конкурс можно тут (правда механизм в настоящее время не работает, но ведутся работы над починкой🙂 )

комментария 3 to “Scripting Games 2009, Advanced Events 1, 2, 3”

  1. Vadims Podans's blog - Scripting Games 2009 – Event2 (The long jump) Says:

    […] XLS в CSV, обработать его и собрать обратно в CSV – тиснуть сюда. Когда я это увидел – стало как-то не очень хорошо. Я […]

  2. Vadims Podans’s mirror blog » Blog Archive » Scripting Games 2009 – Event2 (The long jump) Says:

    […] XLS в CSV, обработать его и собрать обратно в CSV – тиснуть сюда. Когда я это увидел – стало как-то не очень хорошо. Я […]

  3. Scripting Games 2009, Advanced Events 4, 5, 6 « PowerShell и другие скрипты Says:

    […] Drawing, Form, Image, Parsing, Regular Exspressions, Scripting Games 2009 — Xaegr @ 10:45 Продолжаю публиковать свои решения задачек Scripting Games из […]


Обсуждение закрыто.

%d такие блоггеры, как: