Сохранить свойство с запятой в CSV

#powershell #active-directory

#powershell #active-directory

Вопрос:

Я создаю CSV-файл в powershell.

Прямо сейчас мой код:

 Add-content -Path $filePath -Value "$($variable.Property)"
  

По большей части это работает нормально, ЗА исключением случаев, когда свойство содержит запятую ie. «тест, организация».
Когда я открываю CSV, запятая берется вместе с ним (что я и хочу), вызывая дополнительное разделение. Как сохранить «тест, организация» в один столбец?

Комментарии:

1. Export-CSV или ConvertTo-Csv следует экранировать запятые в формате CSV. Если вам нужно вручную экранировать значения с помощью запятых, заключите их в кавычки. Value1,"test, organization",Value3 в CSV должно быть три значения с запятой в среднем значении.

Ответ №1:

Ссылаясь на документацию для Export-CSV, вам нужно будет использовать другой разделитель, например точку с запятой.

При чтении CSV-файла вы также должны указать разделитель: Import-CSV.

Ответ №2:

Попробуйте указать свои свойства:

 Add-content -Path $filePath -Value "'$($variable.Property)'"
  

Или используйте одну из встроенных команд CSV, которые автоматически заключают все значения в кавычки:

 $foo.Bar | Export-Csv -Path $filePath
$foo.Bar| ConvertTo-Csv | Out-File -Path $filePath
  

Если вы просто хотите избежать проблем с запятыми, вы можете изменить разделитель между полями:

 $foo | Export-Csv -Path $filePath -Delimiter '|'
  

Комментарии:

1. Я попробовал » "$($variable.Property) «, и это работает так, как должно для первого значения, но когда я вставляю несколько: т.е. -Значение » "$($variable.Property) » "$($variable.Property2) "$($variable.Property3) » , цитаты добавляются в столбец (т. е. в csv это выглядит как Property1, «Property2», «Property3». Это нормально?

2. @userone Да, если значение может содержать ваш разделитель, вы бы заключили его в кавычки. По умолчанию Export-CSV все значения заключаются в кавычки, прежде чем разделять их разделителем. Это немного сложно определить с форматированием, но у вас может быть слишком много кавычек или Add-Content вы можете использовать их как отдельные входные данные.

3. Если у вас по-прежнему возникают проблемы, можете ли вы добавить пример желаемого результата и того, что вы получаете? Что-то вроде: "Orange","Apple","Banana, comma","Peach" с более чем одной строкой и столбцом

Ответ №3:

Вот статья о том, как использовать out-file или add-member, когда некоторые ячейки строки имеют запятые в значениях переменных, а некоторые нет.

https://imjustanengineer.blogspot.com/2022/01/so-youre-trying-to-use-powershell-out.html

Вот фрагмент кода, более подробное объяснение с полной рабочей функцией находится по ссылке. $outputArr — это массив всех строк данных csv, которые вы хотите записать в csv. Цикл проверяет каждую строку на наличие запятых внутри отдельных записей ячейки и заключает эту запись в кавычки, если она есть. Если этого не происходит, корректировка не требуется, а затем добавляется новый массив.

 $index = 0;
        foreach ($outputTemp in $outputArr)
        {
            if ($outputTemp.ToString().Contains(","))
            {
                $output  = "`"$outputTemp`",";
            }
            else
            {
                $output  = $outputTemp   ",";
            }

            $index  ;
        
            if ($index -eq $outputArr.Count)
            {
                if ($output.EndsWith(","))
                {
                    $output = $output.Remove($output.Length - 1);
                }
            }
        }
  

Ответ №4:

Я нашел дьявольски простой ответ после того, как открыл csv-файл в Excel и добавил текст и запятые в один столбец. Когда я сохранял, закрывал и снова открывал, в столбце все еще были правильно отформатированы все слова и запятые. Итак, затем я открыл файл в notepad и вот что я нашел:

 column1text, column2text,"column3,text,with,commas"
  

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

 column1text, column2text, "column3,text,with,commas" 
  

разбивает все слова на отдельные столбцы, потому что между ними есть пробел

 column2text, "column3,etc"
  

Уберите это пространство

 column2text,"column3,etc" 
  

и все, что заключено в двойные кавычки, остается в одном столбце.

Пример использования отличительного имени active directory, такого как CN=somename, OU= контроллеры домена, DC= foo, DC= bar

 $computers = get-adcomputer -filter *

foreach ($computer in $computers) {
    $deviceName = $computer.Name
    $dn = '"'   $computer.DistinguishedName   '"'
    $guid = $computer.objectGUID
    $lastLogon = $computer.LastLogonDate
    $serialNumber = $computer.serialNumber
    $whenCreated = $computer.whenCreated
    "$guid, $lastLogon, $deviceName, $serialNumber, $whenCreated,$dn" | add-content "c:tempfilename.csv"
    }
  

Это не сработает, если между $whenCreated и $dn добавлен пробел, например:

 "$guid, $lastLogon, $deviceName, $serialNumber, $whenCreated, $dn" | add-content "c:tempfilename.csv"
  

Это заняло целый день, поэтому я надеюсь, что это сэкономит кому-то время и разочарование.