1

У меня есть CSV-файл с разделителями табуляции (test.txt) с содержимым, похожим на следующее (у моего CSV нет заголовка):

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

Я пытался оба из следующих действий для импорта данных в массив:

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

(или же)

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

Независимо от того, как я подхожу к этому, PS продолжает хотеть удалить начальные (ведущие) кавычки из элементов DESC в массиве (и в итоге я получаю результаты, которые выглядят следующим образом - которые не совпадают с исходными данными):

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

При сравнении с исходными данными вы можете увидеть, что некоторые кавычки отсутствуют. Как я могу остановить (предотвратить) PS от удаления кавычек из элементов, как это? Мне нужно импортировать CSV, манипулировать данными и затем экспортировать их обратно в другой CSV. Каждый раз, когда я ищу ответ в Интернете, я получаю результаты о том, как удалить кавычки, но не могу найти, как их сохранить. Я не хочу, чтобы кавычки были удалены в процессе импорта или экспорта.

Заранее спасибо,

STGdb

1 ответ1

3

Ваш файл не является действительным CSV. (Ну, нет официального стандарта, но есть де-факто .) Двойные кавычки имеют особое значение в CSV для окружающих полей. Те, которые не являются "окружающими", нужно каким-то образом избежать, обычно используя их удвоение, например так:

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

Вы также должны окружить все поле двойными кавычками, иначе парсер запутается. Вот почему поле начинается и заканчивается тремя двойными кавычками.

Если вы не можете изменить формат файла, вы можете просто разобрать его самостоятельно, разделив вкладки. Это, конечно, будет работать только в том случае, если вы можете гарантировать, что внутри фактических полей не будет никаких вкладок. Вкладки должны использоваться исключительно как разделители полей.

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

Выход:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .