Private/Csv.ps1

#Requires -Version 5.1

function ConvertTo-SMBeatCsvText {
    param(
        [AllowEmptyCollection()]
        [object[]]$InputObject,
        [Parameter(Mandatory = $true)]
        [ValidateSet('de', 'en')]
        [string]$CsvCulture
    )

    if ($null -eq $InputObject -or $InputObject.Count -eq 0) {
        return ''
    }

    $culture = $script:SMBeatInvariant
    $delimiter = ','
    if ($CsvCulture -eq 'de') {
        $culture = [System.Globalization.CultureInfo]::GetCultureInfo('de-DE')
        $delimiter = ';'
    }
    else {
        $culture = [System.Globalization.CultureInfo]::GetCultureInfo('en-US')
    }

    $old = [System.Threading.Thread]::CurrentThread.CurrentCulture
    try {
        [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
        $InputObject | ConvertTo-Csv -NoTypeInformation -Delimiter $delimiter | Out-String
    }
    finally {
        [System.Threading.Thread]::CurrentThread.CurrentCulture = $old
    }
}

function Write-SMBeatCsvFile {
    param(
        [Parameter(Mandatory = $true)]
        [string]$Path,
        [AllowEmptyCollection()]
        [object[]]$InputObject,
        [ValidateSet('de', 'en')]
        [string]$CsvCulture
    )

    $text = ConvertTo-SMBeatCsvText -InputObject $InputObject -CsvCulture $CsvCulture
    $utf8Bom = New-Object System.Text.UTF8Encoding $true
    $dir = Split-Path -Parent $Path
    if ($dir -and -not (Test-Path -LiteralPath $dir)) {
        New-Item -ItemType Directory -Path $dir -Force | Out-Null
    }
    [System.IO.File]::WriteAllText($Path, $text, $utf8Bom)
}