Как экспортировать многострочную строку в однострочный текст - PullRequest
2 голосов
/ 28 марта 2019

У меня есть текстовый файл "c: \ zz.txt", фрагмент которого выглядит следующим образом:

#N ABSA ALL ROUNDER FoF
#D UT-ABSAAG
#P 20190215    393.83    393.83   0.00

#N ABSA BALANCED FUND
#D UT-ABSABA
#P 20190215    432.28    432.28   0.00

#N COMMUNITY GILT
#D UT-COM-G
#P 20190215    151.21    151.21   8.59

Я хотел бы экспортировать его в файл .TXT в следующем формате:

UT_Name,UT_Code,Date,Value1,Value2,Vol
ABSA ALL ROUNDER FoF,UT-ABSAAG,20190215,393.83,393.83,0
ABSA BALANCED FUND,UT-ABSABA,20190215,432.28,432.28,0
COMMUNITY GILT,UT-COM-G,20190215,151.21,151.21,8.59

Мой код ниже

clear-Host
get-content -raw "c:\zz.txt" | % { $_ -replace '(#N)',"`r`n"} |% { $_ -replace '(#D|#P)',','}|Set-Content ZZ1.txt

Вывод:

ABSA ALL ROUNDER FoF, UT-ABSAAG, 20190215    393.83    393.83   0.00
ABSA BALANCED FUND, UT-ABSABA, 20190215    432.28    432.28   0.00
COMMUNITY GILT, UT-COM-G, 20190215    151.21    151.21   8.59

Проблема: проблема заключается в том, что набор данных "#P" в исходном наборе данных имеет фиксированную длинуэто означает, что я не могу просто заменить все пробелы запятыми, поскольку это также повлияет на имена полей "#N" и "#D", на которые я не хочу влиять.

Как выборочно заменить пробелы

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Другой метод:

$Data = @'
#N ABSA ALL ROUNDER FoF
#D UT-ABSAAG
#P 20190215    393.83    393.83   0.00

#N ABSA BALANCED FUND
#D UT-ABSABA
#P 20190215    432.28    432.28   0.00

#N COMMUNITY GILT
#D UT-COM-G
#P 2019021    151.21    151.21   8.59
'@

#template for learn schema
$template=@'
#N {Vol_ABSA_ALL_ROUNDER_FoF*:ABSA ALL ROUNDER FoF}
#D UT-{UT_Name:ABSAAG}
#P {Date:20190215}    {Value1:393.83}    {Value2:393.83}   {Vol:0.00}

#N {Vol_ABSA_ALL_ROUNDER_FoF*:ABSA ALL ROUNDER FoF 2}
#D UT-{UT_Name:ABSAAG2}
#P {Date:20190216}    {Value1:393.83}    {Value2:393.83}   {Vol:0.00}
'@

$Data | ConvertFrom-String -TemplateContent $template | export-csv "c:\temp\result.csv" -NoType
1 голос
/ 28 марта 2019

Как мне выборочно заменить серии из нескольких пробельных символов?

Например, выбрав только несколько пробелов с квантификатором -replace " {2,}",','

Следующий скрипт, основанный на вашем одном вкладыше:

## Q:\Test\2019\03\28\SO_55387785.ps1
$FileIn = '.\zz.txt'
$FileOut= '.\zz1.txt'

 Set-Content $FileOut -Value "UT_Name,UT_Code,Date,Value1,Value2,Vol"
(Get-Content $FileIn -raw) -replace "(`r?`n)?#N " -replace "`r?`n(#D|#P) | {2,}",',' |
 Add-Content $FileOut

дает этот вывод:

> Get-Content .\ZZ1.txt
UT_Name,UT_Code,Date,Value1,Value2,Vol
ABSA ALL ROUNDER FoF,UT-ABSAAG,20190215,393.83,393.83,0.00
ABSA BALANCED FUND,UT-ABSABA,20190215,432.28,432.28,0.00
COMMUNITY GILT,UT-COM-G,20190215,151.21,151.21,8.59
1 голос
/ 28 марта 2019

это использует именованные группы захвата, чтобы получить элементы, а затем экспортирует их в файл CSV.

# fake reading in a raw text file
#    in real life, use Get-Content -Raw
$InStuff = @'
#N ABSA ALL ROUNDER FoF
#D UT-ABSAAG
#P 20190215    393.83    393.83   0.00

#N ABSA BALANCED FUND
#D UT-ABSABA
#P 20190215    432.28    432.28   0.00

#N COMMUNITY GILT
#D UT-COM-G
#P 20190215    151.21    151.21   8.59
'@

# split into blocks, trim unwanted whitespace, filter out the blank block
$SplitInStuff = ($InStuff -split '#N').Trim().Where({$_})

$Results = foreach ($SIS_Item in $SplitInStuff)
    {
    $Null = $SIS_Item -match '(?sm)(?<UT_Name>^.+$).*#D (?<UT_Code>.+).*#P (?<Date>\d+)\s+(?<Value1>[0-9.]+)\s+(?<Value2>[0-9.]+)\s+(?<Vol>[0-9.]+)'
    [PSCustomObject]@{
        # the ".Trim()" was needed to remove leftover EOL/NewLine/space chars
        UT_Name = $Matches.UT_Name.Trim()
        UT_Code = $Matches.UT_Code.Trim()
        Date = $Matches.Date.Trim()
        Value1 = $Matches.Value1.Trim()
        Value2 = $Matches.Value2.Trim()
        Vol = $Matches.Vol.Trim()
        }
    }

$Results |
    Export-Csv -LiteralPath "$env:TEMP\milkywaypizza_ProductInfo.csv" -NoTypeInformation

содержимое файла CSV ...

"UT_Name","UT_Code","Date","Value1","Value2","Vol"
"ABSA ALL ROUNDER FoF","UT-ABSAAG","20190215","393.83","393.83","0.00"
"ABSA BALANCED FUND","UT-ABSABA","20190215","432.28","432.28","0.00"
"COMMUNITY GILT","UT-COM-G","20190215","151.21","151.21","8.59"
...