【问题标题】:Import 1 column of csv, replace string, then join each row into one row with values surrounded in quotes导入 1 列 csv,替换字符串,然后将每一行连接成一行,值用引号括起来
【发布时间】:2021-10-10 23:19:54
【问题描述】:

我正在使用 powershell,并且我有一个包含大量数据的 csv 文件,但我唯一关心的字段是第一个字段。

我需要:

  1. 提取带有标题的第一列数据:Ticket_ID
  2. 从该列 (site:) 中的值中删除尾随字符串
  3. 将列中的所有值合并到一个以空格分隔的行中,但要确保每个值都保留将每个值括起来的双引号。
  4. 在此行前添加一个长字符串并将其写入文件。 (我还没有尝试解决这部分问题,因为我无法让 1-3 充分工作。)

我已经尝试了这段代码的几种排列方式:

    $TT = (Import-Csv '.\sourcefile.csv').______Ticket_ID______ -join (" ")
    $TT = $TT -replace 'site:',''
    $TT | Set-Content -Path .\JulyTickets.csv

我的 csv 示例:

"______Ticket_ID______","____________Title____________","___________CreateDate___________"
"site:TICKET1","SOMETITLE","01/01/1901"
"site:TICKET2","SOMETITLE","01/01/1901"
"site:TICKET3","SOMETITLE","01/01/1901"
"site:TICKET4","SOMETITLE","01/01/1901"
"site:TICKET5","SOMETITLE","01/01/1901"

我的不满: 如果我使用 Export-CSV,则生成的 csv 仅包含值的字符长度。

如果我使用 Set-Content,我可以成功提取第一列,并删除前导字符串 (site:),将所有行合并为一行,并将其写入文件但它不保留csv 中每个值的双引号(“site:TICKET1”)。输出如下所示:

TICKET1 TICKET2 TICKET3 TICKET4 TICKET5

我不确定我在这里做的事情是否有问题,或者我是否遗漏了一些东西,但我无法将两个值都内联,并单独用引号括起来。

所需输出:

this is a long string that needs to be prepended to the data "TICKET1" "TICKET2" "TICKET3" "TICKET4" "TICKET5"

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    应该这样做。最终需要管道和PowerShell的Calculated Properties表达式是为了克服powershell去除双引号

    $string = 'this is a long string that needs to be prepended to the data ' + (Get-Content -Path \.sourcefile.csv | Convertfrom-Csv -Delimiter "," | select ______Ticket_ID______ -ExpandProperty ______Ticket_ID______ | ForEach-Object {$_ -replace 'site:', '';} | select @{ Name = 'Ticket';  Expression = {$([char]34) + $_ + $([char]34)}} | Select Ticket -ExpandProperty Ticket);
    write-host $string
    

    返回

    this is a long string that needs to be prepended to the data "TICKET1" "TICKET2" "TICKET3" "TICKET4" "TICKET5"
    

    【讨论】:

    • 是的,这行得通。但是现在我遇到了另一个我必须解决的问题,那就是我的源文件中的数据。似乎有些条目在后面的一些字段中有换行符,这些字段填充的 _______TICKET_ID____ 字段不仅仅是票号。我必须解决这个问题。
    【解决方案2】:

    试试这个,我使用-Header 参数,因为唯一需要的列是第一个。

    $csv = @'
    "______Ticket_ID______","____________Title____________","___________CreateDate___________"
    "site:TICKET1","SOMETITLE","01/01/1901"
    "site:TICKET2","SOMETITLE","01/01/1901"
    "site:TICKET3","SOMETITLE","01/01/1901"
    "site:TICKET4","SOMETITLE","01/01/1901"
    "site:TICKET5","SOMETITLE","01/01/1901"
    '@ |
    ConvertFrom-Csv -Header ID |
    Select-Object -Skip 1 |
    ForEach-Object {
        '"{0}"' -f $_.ID.TrimStart('site:')
    }
    
    $toPrepend = 'this is a long string that needs to be prepended to the data'
    
    "$toPrepend $($csv -join ' ')"
    
    # Above yields => this is a long string that needs to be prepended to the data "TICKET1" "TICKET2" "TICKET3" "TICKET4" "TICKET5"
    

    注意,我在这里仅使用 ConvertFrom-Csv 作为示例,但在您的情况下,它应该如下所示:

    $TT = Import-Csv '.\sourcefile.csv' -Header ID | Select-Object -Skip 1 | ForEach-Object {
        '"{0}"' -f $_.ID.TrimStart('site:')
    }
    
    $toPrepend = 'this is a long string that needs to be prepended to the data'
    
    "$toPrepend $($TT -join ' ')" | Out-File JulyTickets.csv # => Not sure why CSV here, since this is no longer a CSV
    

    【讨论】:

    • 虽然这看起来可行,但另一个示例似乎要简化得多。
    猜你喜欢
    • 2019-09-11
    • 2017-05-30
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多