Каковы параметры для параметра -Encoding в инструменте Import-DbaCsv? - PullRequest
0 голосов
/ 28 мая 2019

Я не могу понять, что ожидает инструмент Import-DbaCsv для параметра -Encoding .

Документы не помогают - https://docs.dbatools.io/#Import-DbaCsv

Я пробовал UTF-8, UTF8 и UTF в верхнем, нижнем регистре, с кавычками и без кавычек.

Я всегда получаю сообщение об ошибке, подобное этому:

Невозможно преобразовать значение "UTF-8" типа "System.String" в тип "System.Text.Encoding"

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Ожидаемый тип - System.Text.Encoding, но здесь нет встроенных преобразований строки в кодировку.

Это можно исправить, применив PSTypeConverter:

using namespace System.Management.Automation
using namespace System.Text

class PSTextEncodingConverter : PSTypeConverter {
    hidden
    [hashtable]
    $ConversionTable = @{
        'ASCII'               = [System.Text.Encoding]::ASCII
        'ANSI'                = [System.Text.Encoding]::ASCII

        'UTF7'                = [System.Text.Encoding]::UTF7
        'UTF-7'               = [System.Text.Encoding]::UTF7

        'UTF8'                = [System.Text.Encoding]::UTF8
        'UTF-8'               = [System.Text.Encoding]::UTF8

        'Unicode'             = [System.Text.Encoding]::Unicode
        'UTF16LE'             = [System.Text.Encoding]::Unicode
        'LittleEndianUnicode' = [System.Text.Encoding]::Unicode

        'UTF16BE'             = [System.Text.Encoding]::BigEndianUnicode
        'BigEndianUnicode'    = [System.Text.Encoding]::BigEndianUnicode

        'UTF32'               = [System.Text.Encoding]::UTF32
        'UTF-32'              = [System.Text.Encoding]::UTF32

        'Default'             = [System.Text.Encoding]::Default        
    }

    [bool]
    CanConvertFrom([object]$value, [type]$targetType) {
        return (
            $this.IsEncodingType($targetType)
        ) -and (
            (
                $value -is $targetType
            ) -or (
                (
                    $value -is [string] 
                ) -and (
                    "$value" -in $this.ConversionTable.Keys
                )
            )
        )
    }

    [object]
    ConvertFrom([object]$value, [Type]$targetType, [IFormatProvider]$format, [bool]$ignoreCase) {
        if ($value -is $targetType) {
            return $value
        }

        if ($this.ConversionTable.Contains("$value")) {
            return $this.ConversionTable["$value"]
        }

        throw "Failed to convert '$value' to [$($targetType.FullName)]."
    }

    [bool]
    CanConvertTo([object]$value, [Type]$targetType) {
        return $this.CanConvertFrom($value, $targetType)
    }

    [object]
    ConvertTo([object]$value, [Type]$targetType, [IFormatProvider]$format, [bool]$ignoreCase) {
        return $this.ConvertFrom($value, $targetType, $format, $ignoreCase)
    }

    [bool]
    IsEncodingType([type]$targetType) {
        $type = $targetType
        do {
            if ($type -eq [Encoding]) {
                return $true
            }
        } while (($type = $type.BaseType) -ne $null)

        return $false
    }
}

Затем зарегистрируйте преобразователь типа с помощью Update-TypeData:

Update-TypeData -TypeName System.Text.Encoding -TypeConverter PSTextEncodingConverter

Теперь любой параметр, который ожидает экземпляр [Encoding], примет вместо него строковое значение UTF-8 или UTF8:

Import-DbaCsv -Path .\file.csv -SqlInstance sqlsrv -Database db1 -Encoding UTF8
1 голос
/ 28 мая 2019

Ссылка, которую вы дали нам, показывает, что параметр -Encoding имеет тип <Encoding>, что заставляет меня думать, что вам нужно использовать любой из классов кодирования [System.Text.Encoding] вместо строки:

enter image description here

Так что в вашем случае используйте [System.Text.Encoding]::UTF8

0 голосов
/ 30 мая 2019

Извините, это было плохо. Я обновил Import-DbaCsv за тонну, и это будет решено, когда dbatools 1.0 выйдет через 20 дней. В дополнение к возможности передавать кодировку в виде обычного текста, Encoding будет автозаполняться и фактически будет работать , когда мы выпустим. Если вы хотите сделать это раньше, загляните в нашу ветку prerelease в GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...