合并多行文本以形成CSV文件的每一行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并多行文本以形成CSV文件的每一行相关的知识,希望对你有一定的参考价值。

我正在努力清理输出

cscript 'C:Program Files (x86)Microsoft OfficeOffice16ospp.vbs' /dstatus

我想只显示许可证和密钥的最后5个字符,例如

Office16HomeBusinessR_Retail3版,7H67X

我有它的一部分,但不能把它整合在一起。

$comp = "Computername"
$OfficLice = "C:shareOfficLice.csv"
$localtemp = "C:shareOfficLiceTemp.csv"

cscript 'C:Program Files (x86)Microsoft OfficeOffice16ospp.vbs' /dstatus $comp | add-content $localtemp

$lic = get-content $localtemp | where {$_ -like "LICENSE NAME*"}
$key = get-content $localtemp | where {$_ -like "Last 5*"} 
$key = foreach ($item in $key){
    ($item -split ' ')[7]} 


foreach ($item in $lic){
     ($item -split ' ')[4] | add-content -Path  $OfficLice.("License Name")

}

foreach ($item in $key){
    $item | add-content -Path $OfficLice.Key
}

这是我正在努力清理的副本

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

---Processing--------------------------
---------------------------------------
PRODUCT ID: 00333-59056-17787-AA631
SKU ID: 522f8458-7d49-42ff-a93b-670f6b6176ae
LICENSE NAME: Office 16, Office16HomeBusinessR_Retail3 edition
LICENSE DESCRIPTION: Office 16, RETAIL channel
LICENSE STATUS:  ---LICENSED--- 
Last 5 characters of installed product key: 7H67X
---------------------------------------
PRODUCT ID: 00340-00000-00000-AA482
SKU ID: 971cd368-f2e1-49c1-aedd-330909ce18b6
LICENSE NAME: Office 16, Office16SkypeforBusinessEntryR_PrepidBypass edition
LICENSE DESCRIPTION: Office 16, RETAIL(Free) channel
LICENSE STATUS:  ---LICENSED--- 
ERROR CODE: 0x4004FC05 (for information purposes only as the status is licensed)
ERROR DESCRIPTION: The Software Licensing Service reported that the application has a perpetual grace period.
Last 5 characters of installed product key: HT9YM
---------------------------------------
PRODUCT ID: 00198-20000-00000-AA054
SKU ID: ff693bf4-0276-4ddb-bb42-74ef1a0c9f4d
LICENSE NAME: Office 15, OfficeLyncEntryR_PrepidBypass edition
LICENSE DESCRIPTION: Office 15, RETAIL(Free) channel
LICENSE STATUS:  ---LICENSED--- 
ERROR CODE: 0x4004FC05 (for information purposes only as the status is licensed)
ERROR DESCRIPTION: The Software Licensing Service reported that the application has a perpetual grace period.
Last 5 characters of installed product key: BPW98
---------------------------------------
---------------------------------------
---Exiting-----------------------------
答案

即使你我不喜欢你试图解决这个特殊情况的方式,这里是你的代码更新,并希望提供预期的结果。

$comp = "Computername"
$OfficLice = "C:shareOfficLice.csv"

$localtemp = cscript 'C:Program Files (x86)Microsoft OfficeOffice16ospp.vbs' /dstatus $comp

$filteredOutput = $localtemp | Where-Object {($_ -like "License Name*") -or ($_ -like "Last 5*")}

$licenseInformation = @()

for ($i = 0; $i -lt $filteredOutput.Count; $i = $i + 2) {
    $combinedLicenseInformation = [PSCustomObject]@{
      LicenseName = ($filteredOutput[$i] -split ' ')[4];
      Last5Characters = ($filteredOutput[$i + 1] -split ' ')[7]
    }
    $licenseInformation += $combinedLicenseInformation
}

$licenseInformation | Export-Csv -Path $OfficLice -NoTypeInformation

周末愉快!

另一答案

这是一个简化的解决方案,它使用switch语句处理具有正则表达式匹配的输入对象数组的能力(作为奖励,switch也明显快于管道解决方案):

$comp = "Computername"
$OfficLice = "C:shareOfficLice.csv"

& { 
  switch -regex (cscript 'C:Program Files (x86)Microsoft OfficeOffice16ospp.vbs' /dstatus $comp) {
    '^LICENSE NAME: (.*)' { 
        # Create a new custom object, filled with just the license name
        # for now.
        $o = [pscustomobject] @{
            Lic = $Matches[1]
            Key = ''
        }
    }
    '^Last 5 characters of installed product key: (.*)' { 
        # Add the license key info...
        $o.Key = $Matches[1] 
        # ... and output the complete object
        $o
    }
  }
} | Export-Csv -NoTypeInformation $OfficLice

请注意,Export-Csv默认使用ASCII编码;如果需要,使用-Encoding参数。

使用示例输入,生成的CSV文件如下所示:

"Lic","Key"
"Office 16, Office16HomeBusinessR_Retail3 edition","7H67X"
"Office 16, Office16SkypeforBusinessEntryR_PrepidBypass edition","HT9YM"
"Office 15, OfficeLyncEntryR_PrepidBypass edition","BPW98"
  • switch -regex (...)运行外部cscript命令并单独处理每个结果输出行。
  • 由于-regex,分支条件被解释为正则表达式。
  • 与使用-match运算符类似,实际捕获的正则表达式记录在自动$Matches变量中,其索引1的条目包含正则表达式((...))中捕获的第一个捕获组 - 在我们的示例中,许可证名称和许可证密钥,分别。
  • 第一个分支处理程序使用许可证名称初始化每个输出对象,第二个分支处理程序添加许可证密钥信息,之后输出对象。
  • switch语句的总输出是所有输出对象的数组,其元素一个接一个地传递到Export-Csv。 请注意,将switch语句包含在& { ... }中 - 即通过脚本块调用 - 对于能够在管道中使用它是必要的。

以上是关于合并多行文本以形成CSV文件的每一行的主要内容,如果未能解决你的问题,请参考以下文章

Python如何读取csv文件某一列的每一行数据,并判断该数值是不是满足条件?

使用Python,如何遍历csv文件的每一行记录的每一个字段值?并进行字段值是不是符合条件的判断?

python中对csv文件某一列的每一行文本进行分词后再写到该文件另一列怎么做

使用批处理使一个TXT文件多行合并一行,加逗号

Beautifulsoup to csv:将一段文本放在一行中

python pandas将两行或多行文本合并为一行