Powershell import-csv с пустыми заголовками - PullRequest
4 голосов
/ 30 июля 2010

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

"Невозможно обработать аргумент, поскольку значение аргумента" имя "недопустимо. Измените значение аргумента" имя "и повторите операцию"

потому что заголовок требует имени.

Мне интересно, есть ли у кого-нибудь идеи о том, как манипулировать файлом, чтобы удалить двойные кавычки или перечислить их с "1", "2" "3 "..." 10 "и т. Д.

В идеале я не хотел бы изменять исходный файл.Я думал что-то вроде этого

$fileContents = Get-Content -Path = $tsvFileName
$firstLine = $fileContents[0].ToString().Replace('`t""',"")
$fileContents[0] = $firstLine
Import-Csv $fileContents -Delimiter "`t"

Но Import-Csv ожидает, что $ fileContents будет путем.Могу ли я заставить его использовать Контент в качестве источника?

Ответы [ 3 ]

11 голосов
/ 30 июля 2010

Вы можете предоставить свои собственные заголовки и игнорировать первую строку csv, или вы можете использовать convertfrom-csv в конце, как говорит Кит.

ps> import-csv -Header a,b,c,d,e foo.csv

Теперь недопустимые заголовки в файле - это просто строка, которую вы можете пропустить.

-Oisin

3 голосов
/ 04 августа 2010

Мне пришлось обработать несколько экземпляров этой проблемы. Вместо того, чтобы использовать -Header и вручную настраивать каждый экземпляр импорта, я написал более общий метод, который будет применяться ко всем из них. Я исключаю все экземпляры `t" "первой строки и сохраняю файл, чтобы открыть его как $ filename + _bak, и импортирую его.

$fileContents = Get-Content -Path $tsvFileName

if( ([string]$fileContents[0]).ToString().Contains('""') )
{
  [string]$fixedFirstLine = $fileContents[0].ToString().Replace('`t""',"")
  $fileContents[0] = $fixedFirstLine
  $tsvFileName = [string]::Format("{0}_bak",$tsvFileName

  $fileContents | Out-File -FilePath $tsvFileName

}

Import-Csv $tsvFileName -Delimiter "`t"
3 голосов
/ 30 июля 2010

Если вы хотите работать со строками, используйте ConvertFrom-Csv, например ::1001*

PS> 'FName,LName','John,Doe','Jane,Doe' | ConvertFrom-Csv | Format-Table -Auto

FName LName
----- -----
John  Doe
Jane  Doe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...