【问题标题】:Unstructured Text to CSV非结构化文本到 CSV
【发布时间】:2019-02-20 09:16:45
【问题描述】:

我试图获得 powershell 脚本的解决方案,以便从未结构化的文本转换为 csv 格式,如果“TechnologyType”包含不同的数据但附加到相同的服务器名,我不知道如何重复更新服务器名。我只找到了一个直接的更新,但这种非结构化的逐行阅读方式有点不同。

来源:

服务器名=svr343 技术类型=存储 编号=100 磁盘大小=3gb 驱动器=物理驱动器 类型=SCSI 技术类型=存储 编号=110 磁盘大小=9GB 驱动器=物理驱动器 类型=SCSI 技术类型=接口 编号=200 本地主机名=svr343 ip地址=1.1.1.1 技术类型=接口 编号=220 本地主机名=svr343 ip地址=2.2.2.2 服务器名=svr400 技术类型=存储 编号=180 磁盘大小=5gb 驱动器=物理驱动器 类型=SCSI 技术类型=存储 编号=190 磁盘大小=15gb 驱动器=物理驱动器 类型=SCSI 技术类型=接口 编号=250 本地主机名=svr400 ip地址=5.5.5.5 技术类型=接口 编号=260 本地主机名=svr400 ip地址=6.6.6.6

CSV 输出:

"ServerName","TechnologyType","ID","DISkSize","Drive","Type","localhostname","IPAddress" "svr343","存储","100","3gb","物理驱动器","SCSI","","" "svr343","存储","110","9gb","物理驱动器","SCSI","","" "svr343","接口","200","","","","svr343","1.1.1.1" "svr343","接口","220","","","","svr343","2.2.2.2" "svr400","存储","180","5gb","物理驱动器","SCSI","","" "svr400","存储","190","15gb","物理驱动器","SCSI","","" "svr400","接口","250","","","","svr343","5.5.5.5" "svr400","接口","260","","","","svr343","6.6.6.6"

【问题讨论】:

  • 贴出你用来获取结果的代码。
  • 第一行 Source: 是否也是文本文件的一部分,还是只是在编写您的问题时发生?
  • 我们还没有收到您的来信。这两个答案是否解决了您的问题?如果是这样,请考虑通过单击左侧的 ✓ 来支持或接受该答案。这将帮助其他有类似问题的人更轻松地找到它。

标签: powershell export-to-csv


【解决方案1】:

要读取和解析这样的文件,下面的代码应该适合你:

# read the textfile in as one single string
$serverInfo = Get-Content 'FULL PATH TO THE UNSTRUCTURED TEXT FILE' -Raw
$outputFile = 'FULL PATH TO THE RESULTING CSV FILE'

$result = @()
# match all 'Servername' blocks of text
$regex  = [regex]'(?s)Servername=((?!Servername=).)*'
$serverBlocks = $regex.Matches($serverInfo)
foreach ($server in $serverBlocks) {
    # get the server name from this text block. If missing, call it 'unknown'
    $serverName = if ($server -match 'Servername=(.*)') { $matches[1].Trim() } else { 'unknown' }

    # match all 'Technology' (server details) blocks of text
    $regex = [regex]'(?s)TechnologyType=((?!TechnologyType=).)*'
    $detailsBlocks = $regex.Matches($server.Value)
    foreach ($details in $detailsBlocks) {
        # create an object for output
        $data = "" | Select-Object 'ServerName','TechnologyType','ID','DiskSize','Drive','Type','LocalHostname','IPAddress'
        $data.ServerName = $serverName
        # split the Technology block into separate strings and read the name/value pairs
        $details.Value.Trim() -split '\r?\n' | ForEach-Object {
            $name, $value = $_ -split '=', 2
            $value = $value.Trim()
            switch ($name) {
                'TechnologyType' { $data.TechnologyType = $value; break }
                'ID'             { $data.ID = $value; break }
                'DiskSize'       { $data.DiskSize = $value; break }
                'Drive'          { $data.Drive = $value; break }
                'Type'           { $data.Type = $value; break }
                'localhostname'  { $data.LocalHostname = $value; break }
                'ipaddress'      { $data.IPAddress = $value; break }
            }
        }
        # add the object to the result array
        $result += $data
    }
}
# save the info as CSV
$result | Export-Csv $outputFile -NoTypeInformation

在此之后,输出 CSV 文件包含:

"ServerName","TechnologyType","ID","DiskSize","Drive","Type","LocalHostname","IPAddress"
"svr343","Storage","100","3gb","PhysicalDrive","SCSI",,
"svr343","Storage","110","9gb","PhysicalDrive","SCSI",,
"svr343","Interface","200",,,,"svr343","1.1.1.1"
"svr343","Interface","220",,,,"svr343","2.2.2.2"
"svr400","Storage","180","5gb","PhysicalDrive","SCSI",,
"svr400","Storage","190","15gb","PhysicalDrive","SCSI",,
"svr400","Interface","250",,,,"svr400","5.5.5.5"
"svr400","Interface","260",,,,"svr400Servername","6.6.6.6"

【讨论】:

    【解决方案2】:

    这是一个可能的解决方案。

    我选择不评论它,所以你需要自己尝试理解它。 最后使用Export-Csv将数据导出为csv。

    $data = @"
    Servername=svr343
    
    TechnologyType=Storage
    ID=100
    DiskSize=3gb
    Drive=PhysicalDrive
    Type=SCSI
    
    TechnologyType=Storage
    ID=110
    DiskSize=9gb
    Drive=PhysicalDrive
    Type=SCSI
    
    TechnologyType=Interface
    ID=200
    localhostname=svr343
    ipaddress=1.1.1.1
    
    TechnologyType=Interface
    ID=220
    localhostname=svr343
    ipaddress=2.2.2.2
    
    Servername=svr400
    
    TechnologyType=Storage
    ID=180
    DiskSize=5gb
    Drive=PhysicalDrive
    Type=SCSI
    
    TechnologyType=Storage
    ID=190
    DiskSize=15gb
    Drive=PhysicalDrive
    Type=SCSI
    
    TechnologyType=Interface
    ID=250
    localhostname=svr400
    ipaddress=5.5.5.5
    
    TechnologyType=Interface
    ID=260
    localhostname=svr400
    ipaddress=6.6.6.6
    "@
    
    # Convert data
    $outData = @()
    $data -split 'Servername=' | foreach {
    
        $_ -match '([\w|\d]+)\s' | Out-Null
        $serverName = $Matches[1]
    
        $pattern = [Environment]::NewLine+"\s*"+[Environment]::NewLine
        $_ -split $pattern | foreach {
    
            try {
                $stringData = ConvertFrom-StringData -StringData $_
                $stringData.Add("ServerName", $serverName)
                $outData += $stringData
            } catch { }
        }
    }
    
    # Output data
    $outData[3]
    

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2017-07-12
      相关资源
      最近更新 更多