programing

따옴표로 구분된 문자열을 쉼표로 만드는 Powershell Array

bestprogram 2023. 9. 9. 09:46

따옴표로 구분된 문자열을 쉼표로 만드는 Powershell Array

쉼표로 구분된 문자열로 출력해야 하는 배열이 있지만 따옴표 "도 필요합니다.이것이 제가 가진 것입니다.

$myArray = "file1.csv","file2.csv"
$a = ($myArray -join ",")
$a

에 대한 출력$a결국

file1.csv,file2.csv

제가 원하는 출력은

"file1.csv","file2.csv"

어떻게 하면 이것을 해낼 수 있을까요?

여기 있습니다.

[array]$myArray = '"file1.csv"','"file2.csv"'
[string]$a = $null

$a = $myArray -join ","

$a

출력:

"file1.csv","file2.csv"

당신은 탈출할 방법을 찾아야 합니다.". 그래서 여러분들이 이걸 감싸서 할 수 있는 거죠.'.

이 스레드가 오래된 것은 알지만 여기 다른 해결책이 있습니다.

$myArray = "file1.csv","file2.csv"

# Solution with single quote
$a = "'$($myArray -join "','")'"
$a
# Result = 'file1.csv','file2.csv'

# Solution with double quotes
$b = '"{0}"' -f ($myArray -join '","')
$b
# Result = "file1.csv","file2.csv"

PowerShell Core(현재 7.1)를 사용하는 경우 Join-String을 사용할 수 있습니다.
PowerShell 5.1에서는 사용할 수 없습니다.

$myArray | Join-String -DoubleQuote -Separator ','

출력:

"file1.csv","file2.csv"

줄 솔루션

내부에 배열 또는 목록이 있다고 가정할 경우$myArray. 정의:

$myArray = @("one", "two")

다음 두 가지 솔루션이 있습니다.

  1. 큰따옴표( " )를 구분자로 사용:

    '"{0}"' -f ($myArray -join '","') 
    

    출력:

    "one","two"
    
  2. 작은 따옴표( ' )를 구분자로 사용:

    "'{0}'" -f ($myArray -join "','")
    

    출력:

    'one','two'
    

여기 이전 방식의 PowerShell에서 작동하는 Join-String 방법이 있습니다.

function Join-String {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string[]]$StringArray, 
        $Separator=",",
        [switch]$DoubleQuote=$false
    )
    BEGIN{
        $joinArray = [System.Collections.ArrayList]@()
    }
    PROCESS {
        foreach ($astring in $StringArray) {
            $joinArray.Add($astring) | Out-Null
        }
    }
    END {
        $Object = [PSCustomObject]@{}
        $count = 0;
        foreach ($aString in $joinArray) {
            
            $name = "ieo_$($count)"
            $Object | Add-Member -MemberType NoteProperty -Name $name -Value $aString;
            $count = $count + 1;
        }
        $ObjectCsv = $Object | ConvertTo-Csv -NoTypeInformation -Delimiter $separator
        $result = $ObjectCsv[1]
        if (-not $DoubleQuote) {
            $result = $result.Replace('","',",").TrimStart('"').TrimEnd('"')
        }
        return $result
    }
}

어레이 매개 변수 또는 패스스루를 사용하여 호출할 수 있음

Join-String @("file1.txt","file2.txt","file3.txt") -DoubleQuote

출력:

"file1.txt","file2.txt","file3.txt"

또는 패스 루트로서:

@("file1.txt","file2.txt","file3.txt") | Join-String -DoubleQuote

출력:

"file1.txt","file2.txt","file3.txt"    

생략 - 두 배 따옴표

@("file1.txt","file2.txt","file3.txt") | Join-String

출력:

file1.txt,file2.txt,file3.txt

또는 사용자 지정 구분자를 사용하여 세미콜론이라고 합니다.

@("file1.txt","file2.txt","file3.txt") | Join-String -DoubleQuote -Separator ";"

출력:

"file1.txt";"file2.txt";"file3.txt"

@Jason S의 답변에 약간만 더하면 캐리지 리턴(및 라인 피드 - Windows 등)이 추가됩니다.

$myArray | Join-String -DoubleQuote -Separator `r`n

그리고 쉼표와 함께:

$myArray | Join-String -DoubleQuote -Separator ",`r`n"

각 메서드에 대해 내장된 것을 사용하고 뒷따옴표를 사용하여 이중 따옴표를 제거하는 다른 방법이 있습니다.

$myarray = echo file1.csv file2.csv
$myarray.ForEach{"`"$_`""} -join ','

"file1.csv","file2.csv"

공백이 포함된 문자열만 이중으로 따옴표로 묶어야 했습니다.

$myArray = 'foo', 'b ar', "ba`tz" 
$myArray -replace '.*\s.*', '"$0"' -join ','

출력:

foo,"b ar","ba  z"

이는 RegEx 기반의 이점을 활용합니다.-replace연산자는 LHS 피연산자로 배열을 취할 수 있습니다.이 경우 교체가 완료된 새 배열을 출력합니다.

RegEx 패턴.*\s.*적어도 하나의 공백 문자를 포함하는 문자열과 일치합니다..*빈 공간을 포함하는 경우 전체 입력 문자열이 일치하도록 주변 문자와 일치합니다.교체패턴"$0"전체 매치를 인용합니다.일치하는 항목이 없으면 입력 문자열이 견적 없이 전달됩니다.

마침내.-join따옴표로 묶습니다.

언급URL : https://stackoverflow.com/questions/39276437/powershell-array-to-comma-separated-string-with-quotes