Получите доступ к именам столбцов импортируемого(ed) csv-файла, в котором нет строк данных, без повторной загрузки файла

#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)