Powershell Import-csv с символом возврата

Я попробовал следующее, чтобы превратить текстовый файл в документ, используя import-csv, где каждый элемент в исходном документе был новой строкой.

Образец файла.txt

James Cameron
Kirk Cobain
Linda Johnson

Код:

$array = import-csv file.txt | ConvertFrom-Csv -Delim `r

foreach ($Data in $array)
 {
    if (sls $Data Master.txt -quiet)
    {Add-Content file.txt $Data}
 }

Он никогда не создавал документ


person jacob    schedule 07.11.2016    source источник
comment
Он никогда не создавал документ. Дун ду ннннн. Слишком жуткий. Смогли ли когда-нибудь жители деревни найти HEADer Джеймса Т. Кирка Кобейна?   -  person TessellatingHeckler    schedule 08.11.2016


Ответы (1)


Import-Csv берет CSV и выводит PSCustomObjects. Он предназначен для случаев, когда в файле есть строка заголовка, и он считывает ее как свойства объектов. например

FirstName,LastName
James,Cameron
Kirk,Cobain

# ->

@{FirstName='James';LastName='Cameron'}
@{FirstName='Kirk';LastName='Cobain'}
etc.

Если в вашем файле нет строки заголовка, он займет первую строку, а затем испортит все остальное. Вам нужно указать параметр -Header 'h1','h2',..., чтобы исправить это. Таким образом, вы могли бы использовать -Header Name, но ваши данные имеют только одно свойство, так что особой пользы от этого нет.

ConvertFrom-Csv предназначен для того же, но из данных CSV в переменной, а не в файле. Они не соединяются вместе с пользой. Он попытается, но в итоге вы получите...

Один объект со свойством '@{James=Kirk}' и значением '@{James=Linda}', где «Джеймс» был взят из строки 1 в качестве заголовка столбца, а странный синтаксис связан с принудительным повторным преобразованием этих объектов.

Совершенно непонятно, почему вы читаете с file.txt и добавляете к file.txt. Но поскольку у вас нет CSV, нет никакой пользы от использования CSV-командлетов.

$lines = Get-Content file.txt
$master = Get-Content master.txt

foreach ($line in $lines)
{
    if ($master -contains $line)
    {
        Add-Content file2.txt $line
    }
}

или просто

gc file.txt |? { sls $_ master.txt -quiet } | set-content file2.txt

Автоматически сгенерированные ссылки справки PS из моего блока кода (если есть):

  • gc — это псевдоним для Get-Content (в модуле Microsoft.PowerShell.Management)
  • ? — это псевдоним для Where-Object.
  • sls — это псевдоним для Select-String (в модуле Microsoft.PowerShell.Utility)
  • Set-Content (в модуле Microsoft.PowerShell.Management)
person TessellatingHeckler    schedule 07.11.2016