PowerShell - CSV (importação / exportação) remove minhas aspas

1

Eu tenho um arquivo CSV delimitado por tabulação (test.txt) com conteúdo semelhante ao seguinte (meu CSV não tem cabeçalho):

12.33   Apple   Orange  "this is" great "to eat"
10.99   Pear    Lemon   "this" is an - "aquired taste"

Eu tentei os dois itens a seguir para importar os dados em uma matriz:

$Headers = "price","item1","item2","desc"
[array]$arrCSVobjects = import-csv "test.txt" -Delimiter "'t" -Header $Headers

(ou)

$Headers = "price","item1","item2","desc"
[array]$arrCSVobjects = Get-Content -Path "test.txt " | Out-String | ConvertFrom-CSV -Delimiter "'t" -Header $Headers

Não importa o quanto eu me aproxime disso, o PS continua querendo remover as aspas iniciais (principais) dos elementos DESC na matriz (e acabo com resultados semelhantes a este - que não são os mesmos que os dados originais) :

price    item1    item2    desc
-----    -----    -----    ----
12.33    Apple    Orange   this is great "to eat"
10.99    Pear     Lemon    this is an - "aquired taste"

Quando comparado com os dados originais, você pode ver que algumas das aspas estão faltando. Como posso parar (evitar) PS de remover aspas dos elementos como este? Eu preciso importar o CSV, manipular os dados e depois exportá-lo de volta para outro CSV. Toda vez que eu busco na internet uma resposta, continuo obtendo resultados sobre como remover aspas, mas parece que não consigo descobrir como mantê-las. Não quero que as aspas sejam removidas no processo de importação ou exportação.

Agradecemos antecipadamente

STGdb

    
por STGdb 09.03.2017 / 19:31

1 resposta

3

Seu arquivo não é CSV válido. (Bem, não existe um padrão oficial, mas existe um de facto .) As aspas duplas têm um significado especial em CSV para os campos adjacentes. Os que não são "surrounders" têm que escapar de alguma forma, normalmente usando-os para dobrá-los, assim:

12.33   Apple   Orange  """this is"" great ""to eat"""

Você também tem que cercar o campo inteiro com aspas duplas, caso contrário o analisador ficará confuso. É por isso que o campo começa e termina com três aspas duplas.

Se você não puder alterar o formato do arquivo, basta analisá-lo dividindo as guias. Isso, obviamente, só funcionará se você puder garantir que não haverá abas dentro dos campos reais. As guias devem ser usadas apenas como separadores de campo.

gc .\test.txt | 
    % { $f = $_ -split "'t"; [pscustomobject]@{price=$f[0];item1=$f[1];item2=$f[2];desc=$f[3]} }

Saída:

price item1 item2  desc
----- ----- -----  ----
12.33 Apple Orange "this is" great "to eat"
10.99 Pear  Lemon  "this" is an - "aquired taste"
    
por 10.03.2017 / 07:27