【问题标题】:How to export multi line string to single line text如何将多行字符串导出为单行文本
【发布时间】:2019-08-18 15:28:31
【问题描述】:

我有一个文本文件“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”不想影响。

如何选择性地替换空格?

【问题讨论】:

    标签: powershell export-to-csv multilinestring


    【解决方案1】:

    这使用命名的捕获组来获取项目,然后将其导出到 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"
    

    【讨论】:

      【解决方案2】:

      其他方法:

      $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
      

      【讨论】:

      • 我认为在使用ConvertFrom-String 时添加以下免责声明很重要:它提供基于分隔符的解析以及基于包含示例值的模板的基于启发式的解析。基于分隔符的解析应用了您无法控制的自动类型转换,并且模板语言的文档记录很差,确切的行为难以预测 - 最好完全避免使用此 cmdlet。另请注意,它在 PowerShell Core 中不可用。
      【解决方案3】:

      如何选择性地替换多个空白字符的运行?

      例如,仅选择带有量词 -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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        相关资源
        最近更新 更多