#powershell #csv
Вопрос:
Для отображения строки заголовка импортированного csv-файла я использую:
$filename = ...
$table = @(import-csv $filename)
($table[0] | convertTo-csv)[1]
Но если csv-файл содержит только заголовок и никаких последующих строк данных, импортированный объект оказывается равным $null. Я не могу понять, как получить имена свойств такого объекта (кроме повторного чтения файла как raw/ascii с помощью чего-то вроде Get-Content).
Комментарии:
1.
Get-Content $filename |Where {$_ -notmatch '^#'} |Select -First 1
2. @MathiasR.Jessen Это то, что я мог бы «прочитать файл еще раз». Я ищу решение для получения заголовка из уже импортированного объекта. Возможно ли это каким-то образом?
3. Нет, потому что нет «импортированного объекта» —
Import-Csv
анализирует заголовок, извлекает имена столбцов, а затем ни для чего их не использует , потому что нет никаких данных. Так что я думаю, что ответ на ваш вопрос «нет» 🙂
Ответ №1:
попробуйте это :
Get-Content $filename -TotalCount 1
в противном случае вы можете сделать это для свойств списка с вашим объектом :
$csv=import-csv "C:tempfile3.txt"
$csv | Get-Member -MemberType NoteProperty | select Name
Комментарии:
1. Это рабочее решение, но это то, что я мог бы «прочитать файл еще раз». Я ищу решение для получения заголовка из уже импортированного объекта.
2. «Get-Член» в импортированном csv-файле только с заголовком и без строк данных-это суть моей проблемы. Это приводит к ошибке. В нем говорится, что для ввода требуется объект, что позволяет предположить, что $csv здесь не является объектом.
Ответ №2:
Для того чтобы получить доступ к строке заголовка csv-файла без строк данных и не нужно дважды считывать его с диска, не Import-csv
делайте этого сразу, а вместо этого прочитайте весь файл как текстовый файл с помощью Get-Content
, получите доступ к заголовку по желанию, а затем создайте объект csv с помощью ConvertFrom-Csv
:
$filename="<file>"
# read file as text:
$text = @(gc $filename )
# do header line stuff as desired
# (works also on files with no data rows):
# evaluate delimiter
$delimiter = @(",",";")[$text[0].Split(";").Length -gt 1]
# check if particular field exists
$field_present = $text[0].Contains("<column header>")
# create the csv object
$table = (convertFrom-Csv $text -Delimiter $delimiter)