CSV-файл поиска Powershell без заголовков и нестандартных разделителей; возвращать только определенные столбцы в результатах

Вот пример строки в CSV-файле, который у меня есть:

empcode ~ 1 ~ 0 ~ Имя ~ Фамилия ~ Псевдоним ~ 1 ~ Дата начала ~ Руководитель ~ Местоположение ~ Отдел ~ Название работы ~ Расширение

Этот файл обновляется несколько раз в день с информацией о новом сотруднике, и мне нужно иметь возможность искать нового сотрудника, чтобы получить его код сотрудника (empcode), имя (FirstName), фамилию (LastName), Nickname (псевдоним) и Должность (JobTitle).

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

empcode Имя Фамилия Псевдоним Отдел

Я не уверен, что мне подойдет - Get-Content или Import-CSV. И руководство будет очень признательно.

Спасибо!


person dlemley    schedule 13.01.2020    source источник
comment
все значения, указанные в приведенном выше примере, также разделяются ~ вместо запятой?   -  person Jawad    schedule 13.01.2020
comment
правильно, все они разделены знаком ~   -  person dlemley    schedule 13.01.2020


Ответы (1)


так как я слишком ленив, чтобы предоставить данные, которые вы не предоставили, я пропущу чтение данных. вы можете использовать для этого Get-Content. [ухмылка]

что это делает ...

  • получает строку из файла
  • создает список элементов заголовка
  • создает список заголовков для хранения
  • использует ConvertFrom-Csv с параметрами -Delimiter и -Header
  • отфильтровывает все, что нет в списке хранителей
  • сохраняет его в $ Var
  • отображает это на экране

код ...

$InStuff = 'empcode~1~0~TheFirstName~TheLastName~TheNickname~1~startdate~Supervisor~Location~TheDepartment~JobTitle~Extension'

$Header = @'
EmpCode
1stNumber
2ndNumber
FirstName
LastName
NickName
3rdNumber
StartDate
SupervisorName
Location
Department
JobTitle
Extension
'@ -split [System.Environment]::NewLine

$PropsToKeep = @(
    'FirstName'
    'LastName'
    'NickName'
    'Department'
    )

$OutStuff = $InStuff |
    ConvertFrom-Csv -Delimiter '~' -Header $Header |
    Select-Object -Property $PropsToKeep

$OutStuff

вывод ...

FirstName    LastName    NickName    Department   
---------    --------    --------    ----------   
TheFirstName TheLastName TheNickname TheDepartment

в этот момент вы можете легко отправить $ Var Export-Csv ... [ухмылка]

person Lee_Dailey    schedule 13.01.2020
comment
Я ценю твой ответ. Пожалуйста, простите мое незнание в этом вопросе, но у меня есть один вопрос по поводу вашего кода. В CSV-файле нет заголовков, и строка @InStuff всегда будет другой. Разве мне не нужно было бы указывать номера столбцов или даже буквы вместо того, что вы указали в @Header? - person dlemley; 13.01.2020
comment
@dlemley - вы сказали, что это файл CSV, это означает, что структура файла всегда будет одинаковой. если вам нужно общее решение для любой возможной структуры CSV, отредактируйте свой вопрос, чтобы прояснить это - И предоставьте две или три строки примера как минимум из двух разных файлов CSV. - person Lee_Dailey; 13.01.2020
comment
Я не привожу конкретные примеры строк, потому что я защищаю данные сотрудников, содержащиеся в файле CSV. Строка с разделителями, которую я предоставил, - это то, что содержит каждая строка файла CSV, но, очевидно, будет отличаться для каждого сотрудника. Например; Я бы поискал смита, и он вернул бы следующее: P112345 ~ 1 ~ 0 ~ Майкл ~ Смит ~ Майк ~ 1 ~ 01/01/20 ~ Джон Джонс ~ Нью-Йорк ~ Бухгалтерский учет ~ Бухгалтер ~ 3320 Я бы хотел сократить результаты, поэтому он возвращает только следующее: P112345 Майкл Смит Майк Бухгалтер - person dlemley; 13.01.2020
comment
@dlemley - я понимаю, как дезинфицировать данные. [ухмылка] Вы уже пробовали опубликованный мной код? если вы поместите часть заголовка и чтение файла перед фактическим кодом, он должен работать. ///// я готов протестировать это - и предоставить более реалистичный фрагмент кода ... но я не собираюсь придумывать данные для работы. если вам нужен реалистичный код, вы должны предоставить реалистичные данные для работы. две или три строки ваших данных - очищенные данные - сделают свою работу. если вы хотите автоматизировать создание заголовков вместо того, чтобы вручную перечислять их заранее, скажите об этом. - person Lee_Dailey; 13.01.2020
comment
Спасибо за ваше время. Я не собираюсь размещать актуальные данные о компании в Интернете. - person dlemley; 13.01.2020
comment
@dlemley - эээ, я не запрашивал данные компании. я запрашивал реалистичные, очищенные данные . если вы отказываетесь предоставить две или три строки таких данных ... почему вы ожидаете, что другие будут делать то, что вы отказываетесь делать? - person Lee_Dailey; 14.01.2020