PowerShell - Le format CSV (importation / exportation) supprime mes guillemets

1

J'ai un fichier CSV délimité par des tabulations (test.txt) avec un contenu semblable au suivant (mon CSV n'a pas d'en-tête):

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

J'ai essayé les deux opérations suivantes pour importer les données dans un tableau:

$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

Quelle que soit mon approche, PS continue de vouloir supprimer les guillemets de départ des éléments DESC du tableau (et les résultats ressemblent à ceux-ci - ils ne sont pas identiques aux données d'origine):

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

Lorsque vous comparez avec les données d'origine, vous pouvez voir que certains des guillemets sont manquants. Comment puis-je empêcher (empêcher) PS de supprimer les guillemets des éléments comme celui-ci? Je dois importer le fichier CSV, manipuler les données puis les exporter à nouveau vers un autre fichier CSV. Chaque fois que je cherche une réponse sur Internet, je continue d’obtenir des résultats sur la façon de supprimer les guillemets, mais je n'arrive pas à trouver comment les conserver. Je ne veux pas que les guillemets soient supprimés lors du processus d'importation ou d'exportation.

Merci d'avance,

STGdb

STGdb
la source
Ces citations sont-elles réellement nécessaires? Après tout, ils ne sont probablement là que pour marquer que c'est un argument dans son ensemble et ne descsemble contenir que cet argument, l'argument sans indication.
Seth
Je comprends mais oui, les citations sont nécessaires. Ce que j’avais posté à l’origine était juste un exemple utilisant un format CSV similaire. Le scénario est que l'élément "desc" contient des mots cités en plus des commentaires éditoriaux, c'est-à-dire (aujourd'hui, le maire a déclaré: "Nous ne pouvons pas augmenter le budget", mais le gouverneur a répondu "bla, bla, etc." ) Ainsi, dans cet exemple, vous avez besoin des guillemets pour distinguer les commentaires parlés des commentaires éditoriaux. Mais bon point cependant - merci
STGdb

Réponses:

3

Votre fichier n'est pas valide au format CSV. (Eh bien, il n'y a pas de norme officielle, mais il y en a une de facto .) Les guillemets doubles ont une signification particulière en CSV pour les champs environnants. Ceux qui ne sont pas des "Surrounders" doivent être échappés d'une manière ou d'une autre, généralement en les doublant, comme ceci:

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

Vous devez également entourer tout le champ de guillemets, sinon l’analyseur devient confus. C'est pourquoi le champ commence et se termine par trois guillemets doubles.

Si vous ne pouvez pas modifier le format du fichier, vous pouvez simplement l'analyser vous-même en séparant les onglets. Ceci ne fonctionnera bien entendu que si vous pouvez garantir qu'il n'y aura pas d'onglets dans les champs réels. Les onglets doivent uniquement être utilisés comme séparateurs de champs.

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

Sortie:

price item1 item2  desc
----- ----- -----  ----
12.33 Apple Orange "this is" great "to eat"
10.99 Pear  Lemon  "this" is an - "aquired taste"
dangph
la source
1
Fonctionne parfaitement - merci. Exactement ce dont j'avais besoin, mais pour une raison quelconque, lorsque je l'ai essayée à l'origine, je ne pouvais pas trouver la syntaxe appropriée pour que le fractionnement fonctionne correctement. Impressionnant!!
STGdb