|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Форматирование заголовка *.csv файла |
|
PowerShell - Форматирование заголовка *.csv файла
|
Старожил Сообщения: 252 |
Профиль | Отправить PM | Цитировать
Здравствуйте.
Необходимо редактирование csv заголовка. Пример файла Excel прикреплен. Вот как выглядит файл Excel Скрытый текст
Цитата:
Затем происходит конвертация в формат *csv. Затем файл формата *csv. импортируется и начинается форматирование Вот скрипт Скрытый текст
clear # данный скрипт импортирует файл .*csv, добавляет кавычки значениям в нужных полях # и затем обратно экспортирует в .*csv Function set-pause{ PARAM ( [PARAMETER(Mandatory=$false, HelpMessage = "Укажите сообщение для паузы" ) ]$message ) Read-Host $message } $mes = " Cкрипт ставиться на паузу" $name_x = "d:\script-ps\sample.xlsx" $name_c = "d:\script-ps\sample.csv" $name_out = "d:\script-ps\sample-out.csv" $oExcel = New-Object -ComObject "Excel.Application" $oExcel.DisplayAlerts = $false $oWorkbook = $oExcel.Workbooks.Open("$name_x") $oWorkbook.Sheets.Item("Лист1").SaveAs("$name_c",6) $oWorkbook.Close($false) $oExcel.Quit() #импорт *.csv с кодировкой по умолчанию (в системе - кодировка Windows-1251) Import-Csv $name_c -Encoding Default -Delimiter ',' | # перебор все данных в полученном массиве ForEach-Object -begin { $str = Get-Content $name_c -First 1 # шапка csv $a = $str -split ',' # массив имен объектов $str += "`n" # данные пишутся со следующей строки } -process { $str += [String]::Format( "`"OU = {0},OU = {1},DC = {2},DC = {3}`";{4};`"OU = {5},OU = {6},DC = {7},DC = {8}`";{9};`n",$_."$($a[0])", $_."$($a[1])", $_."$($a[2])", $_."$($a[3])",$_."$($a[4])",$_."$($a[5])", $_."$($a[6])", $_."$($a[7])", $_."$($a[8])",$_."$($a[9])") } -end { $str | Out-File $name_out -Encoding Default -Force } # -begin {...} - блок скрипта, который будет запущен перед обработкой первого объекта ввода # Get-Content .\sample.csv -First 1 - читает только шапку содержимого указанного файла # $str - в этой переменной содержится обрабатываемая строка в текуший момент # -First 1 - этот параметр сообщает оболочке PowerShell, что необходимо выбрать первый объект из этого списка. # -split - Оператор split рабивает исходную строку на части и возвращает массив строк. # Граница, по которой производится разбиение, указывается с помощью # регулярного выражения. # += - опреатор присваивания # $str += "`n" к строке содержащейся в $str в текущий момент добавляется # управляющий символ и затем $str присваивается уже эта видоизменнная строка и # и передается в блок команд -process {...} # -process {...} - блок скрипта, применяемый к каждому входному объекту # $str += - в данном выражении строка сначала форматируется нужным образом, а затем # присваивается обратно переменной $str в уже измененном виде # ` - экранирующий символ, чтобы кавычаи интепретрировались как текст # Format - статический метод форматирования # [String]::Format() - композитное форматирование # Метод Format класса String - возвращает объект строки. # Т.е. он передает возвращаемую им строку по конвейеру Windows PowerShell # Команда содержит элемент форматирования с индексом 0, соответствующим первому объекту в списке. # $_."$($a[1])" - это динамическая переменная, в текущей момент времени она содержит # значение какой-то строки 2-го поля, обрабатываемого файла *.csv и помещает это значение в кавычки # и т.д # -End{...} - запускается после обработки последнего объекта ввода # здесь уже текущая обработанная строка передается по конвейру и экспортируется в файл *.csv Получается *csv. такого вида Скрытый текст
Цитата:
Здесь проблема отформатировать заголовок и привести его к такому виду ou2,ou1,dc2,dc1 – заменяется на DN ou4,ou3,dc4,dc3 – заменяется на СN Тогда файл *.csv должен быть таким Скрытый текст
Цитата:
p.s Длинные куски кода (там где команда Format) пробовал перенести символом ` , но тогда на выходе в файл *.csv записывается текст с переносом. Если знаете как правильно перенести длинный код подскажите. Спасибо. |
||||
Отправлено: 10:15, 23-09-2017 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Цитата maslinaV:
Цитата maslinaV:
Цитата maslinaV:
|
|||
Последний раз редактировалось Busla, 23-09-2017 в 12:08. Отправлено: 11:52, 23-09-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 252
|
Профиль | Отправить PM | Цитировать Цитата Busla:
Я вручную готовил *.csv и поля заголовка разделял , - тогда импорт без ошибок |
|
Отправлено: 12:35, 23-09-2017 | #3 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать maslinaV, для csvde у вас все разделители должны быть запятыми, а не только заголовок
сейчас у вас это работает из-за ошибки в csvde :-) |
Отправлено: 14:57, 23-09-2017 | #4 |
Старожил Сообщения: 252
|
Профиль | Отправить PM | Цитировать Вот переделанный кусок кода
Там в строковой константе я по ошибке использовал ";" , я переделал Вот кусок кода Скрытый текст
ForEach-Object -begin { $str = 'DN,mail,CN,principal' $a = 'ou2,ou1,dc2,dc1,mail,ou3,ou4,dc2,dc1,principal' -split ',' #$str = Get-Content $name_c -First 1 # шапка csv #$a = $str -split ',' # массив имен объектов $str += "`n" # данные пишутся со следующей строки } -process { $str += [String]::` Format( "`"OU = {0},OU = {1},DC = {2},DC = {3}`",{4},`"OU = {5},OU = {6},DC = {7},DC = {8}`",{9}`n",$_."$($a[0])", $_."$($a[1])", $_."$($a[2])",$_."$($a[3])",$_."$($a[4])",$_."$($a[5])",$_."$($a[6])", $_."$($a[7])", $_."$($a[8])",$_."$($a[9])" ) } -end { $str | Out-File $name_out -Encoding Default -Force } А вот что мне надо было получить на выходе Скрытый текст
Цитата:
Что и получилось. Я действительно пытался в стороковой константе сделать перенос, так как не удобно читать длинный код, а разве для строковых констант нет возможности оформить перенос для удобочитаемости кода ? Как оформлю все это в функцию, попробую выложить результат. |
||
Отправлено: 15:10, 23-09-2017 | #5 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать maslinaV, можно разбить строку на несколько, и их конкатенировать
только это не особо повлияет на удобочитаемость, потому что шаблон а одной части, а подстановочные переменные - в другой У меня вообще совершенно всё вызывает недоумение: Я бы или с файлами работал чисто на уровне текста с пребразованием строки регулярным выражением, либо импорт в структуру данных, её преобразование, экспорт. Но зачем весь этот csv, если можно напрямую взять данные из excel и записать в AD. И csvde на момент выхода win 2k3 уже считался устаревшим и недостаточно функциональным - что потом делать с этой прорвой беспарольных учёток? И формат данных в excel сомнительный. И вообще - откуда он, и что первично? Если руками забивает кто-то - так не проще ли сразу дать ограниченный доступ на заведение учёток и пользоваться штатными инструментами - там это нагляднее. И я ещё удивился: кто такой Чечов? - зачем эти извращения с транслитом? |
Отправлено: 18:01, 23-09-2017 | #6 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Создание .bat файла для выборки строк из .csv файла в .xlsx | GODolubOFF | Скриптовые языки администрирования Windows | 10 | 14-12-2015 15:34 | |
Разное - Кодировка файла csv | kit-kater | Microsoft Office (Word, Excel, Outlook и т.д.) | 1 | 08-12-2015 13:15 | |
CMD/BAT - [решено] Периеминование файла doc.csv в Документ_дата_время.csv | kagorec | Скриптовые языки администрирования Windows | 2 | 29-03-2014 18:40 | |
Разное - Редактирование .csv файла | O L E G | Программирование и базы данных | 8 | 24-01-2014 14:59 | |
Восстановление данных из видео файла без заголовка файла | AlexKKK | Видео и аудио: обработка и кодирование | 13 | 31-05-2006 15:27 |
|