2017-07-25 74 views
3

我有不同的数据像这样的输入txt文件:让行成为TXT列使用PowerShell

------------------------------------------------------------------------ 
Current Local Time:    Fri Jul 01 04:54:27 2016 

Current GMT Time:    Thu Jun 30 20:54:27 2016 
Machine ID:      6090 
Machine Name:     WL6090 
Display S/N:     0253G020TG 
Terrain version:    5.3.843.843 
CAESTaskList DLL version:  5.3.843.843 
Application Type:    Terrain/CAES Ultra 
Operating System:    1.04 
Total RAM used by active files: 339.72 kB 

---------------------------------------------------------------------------------------------------------- 

            Disk Space 

Free Disk Space: 6758 MB    Total Disk Space: 7076 MB    

---------------------------------------------------------------------------------------------------------- 

Current Local Time: 07-01-16, 04:54:27 
Current Service Hours: 314.41 

而且我每天都有很多这样的文件。 我试图与PowerShell中真正的新手抢仅供参考我从这些文件需要我做这样的:

$Location = "D:\terrain_dia\Diag01Jul2016_045427.dia" 
$a = Get-Content D:\terrain_dia\Diag01Jul2016_045427.dia 

#Common 
$option = [System.StringSplitOptions]::RemoveEmptyEntries 

#ID 
$LineID = Select-String -Path $Location -Pattern "Machine ID:" | Select-Object -Expand LineNumber 
$ID = ($a)[$LineID-1] 
$ID -replace '(?:\s|\r|\n)','' 

#Name 
$LineName = Select-String -Path $Location -Pattern "Machine Name:" | Select-Object -Expand LineNumber 
$Name = ($a)[$LineName-1] 
$Name -replace '(?:\s|\r|\n)','' 

#SN 
$LineSN = Select-String -Path $Location -Pattern "Display S/N:" | Select-Object -Expand LineNumber 
$SN = ($a)[$LineSN-1] 
$SN -replace '(?:\s|\r|\n)','' 

#Version 
$LineVersion = Select-String -Path $Location -Pattern "Terrain version:" | Select-Object -Expand LineNumber 
$Version = ($a)[$LineVersion-1] 
$Version -replace '(?:\s|\r|\n)','' 

#RAM 
$LineRam = Select-String -Path $Location -Pattern "Total RAM" | Select-Object -Expand LineNumber 
$RAM = ($a)[$LineRam-1] 
$RAM -replace '(?:\s|\r|\n)','' 

#GPSSN 
$LineGPSSN = Select-String -Path $Location -Pattern "GPS Receiver SN:" | Select-Object -Expand LineNumber 
$GPSSN = ($a)[$LineGPSSN-1] 
$GPSSN -replace '(?:\s|\r|\n)','' 

#GPSType 
$LineGPSType = Select-String -Path $Location -Pattern "GPS Receiver Type:" | Select-Object -Expand LineNumber 
$GPSType = ($a)[$LineGPSType-1] 
$GPSType -replace '(?:\s|\r|\n)','' 

#NAV 
$LineNAV = Select-String -Path $Location -Pattern "NAV firmware version:" | Select-Object -Expand LineNumber 
$NAV = ($a)[$LineNAV-1] 
$NAV -replace '(?:\s|\r|\n)','' 

#SIG 
$LineSig = Select-String -Path $Location -Pattern "SIG firmware version:" | Select-Object -Expand LineNumber 
$SIG = ($a)[$LineSig-1] 
$SIG -replace '(?:\s|\r|\n)','' 

#ROM 
$LineROM = Select-String -Path $Location -Pattern "ROM firmware version:" | Select-Object -Expand LineNumber 
$ROM = ($a)[$LineROM-1] 
$ROM -replace '(?:\s|\r|\n)','' 

我得到的输出:

MachineID:6090 
MachineName:WL6090 
DisplayS/N:0253G020TG 
Terrainversion:5.3.843.843 
TotalRAMusedbyactivefiles:339.72kB 
GPSReceiverSN:3351J508SP 
GPSReceiverType:MS992 
NAVfirmwareversion:00506 
SIGfirmwareversion:00506 
ROMfirmwareversion:00425 
FreeDiskSpace:6758MB 
TotalDiskSpace:7076MB 

所以我有一个固定的分隔符 但我真的需要得到的是:

MachineID  MachineName  DisplayS/N 
6090   WL6090   0253G020TG 

所以我需要格式化这个输出txt文件中的表格,然后我要去把它TE导致到MS SQL数据库..

请告知我该怎么格式化所有这些线使用PowerShell?

任何帮助将是非常有用的。

谢谢你喜欢这个

+0

你要生成的文件,然后把它放到SQL服务器?你不可能把它直接放到SQL Server中吗? –

+1

这个文件是否总有一个机器信息?或者它可以有几个MachineID? –

+0

如果要导入到SQL Server中,最好直接生成SQL语句,而不是将其格式化为列。我可以帮你这个,但是当我在我的Windows 7系统上运行代码,我已经得到了'不能索引空array'错误,我不会把我的时间来调试这个:) –

回答

0

这一个班轮将处理所有*。在当前文件夹直径文件和使用正则表达式来筛选含有结肠的所有行,并建立冷凝名称值对,并显示它们格式化:

Select-String .\*.dia -Pattern '^([^:]+):\s+(.*)$' | ForEach-Object { "{0,-20} {1,-25}: {2}" -f $_.FileName,$($_.Matches.Groups[1].Value -replace ' '), ($_.Matches.Groups[2].Value) } 

示例输出:

Sample1.dia   CurrentLocalTime   : Fri Jul 01 04:54:27 2016 
Sample1.dia   CurrentGMTTime   : Thu Jun 30 20:54:27 2016 
Sample1.dia   MachineID    : 6090 
Sample1.dia   MachineName    : WL6090 
Sample1.dia   DisplayS/N    : 0253G020TG 
Sample1.dia   Terrainversion   : 5.3.843.843 
Sample1.dia   CAESTaskListDLLversion : 5.3.843.843 
Sample1.dia   ApplicationType   : Terrain/CAES Ultra 

以下PowerShell脚本使用相同的正则表达式与构建[PSCustomObject]和(如CurrentLocalTime在文件中出现两次并且TotalDiskSpace是在同一行作为FreeDiskSpace有错误的时刻)
否则累加它发现在所有数据的所有属性附加到它文件CumulatedDia.Csv保存它并通过Out-GridView重新导入以显示内容我留下了由您/他人修复的两个缺陷。

$CumDia = ".\CumulatedDia.Csv" 
Remove-Item $CumDia -ErrorAction Ignore 

ForEach($File IN (Get-ChildItem *.dia)){ 
    $DiaFile = $Null 
    $DiaFile = [PSCustomObject]@{'FileOrigin' = $File} 
    Select-String -Path $File -Pattern '^([^:]+):\s+(.*)$' | ForEach-Object { 
     $DiaFile | Add-Member -EA SilentlyContinue ` 
      -NotePropertyName ($_.Matches.Groups[1].Value -replace ' ')` 
      -NotePropertyValue $_.Matches.Groups[2].Value 
    } 
    $DiaFile | fl 
    $DiaFile | Export-Csv -Path $CumDia -Append -NoTypeInformation 
} 
Import-Csv $CumDia|Out-GridView 

不需要的属性/列可以用选择对象删除。 这是一个行的表

FileOrigin    : Q:\Test\2017\07\25\Sample1.dia 
CurrentLocalTime   : Fri Jul 01 04:54:27 2016 
CurrentGMTTime   : Thu Jun 30 20:54:27 2016 
MachineID     : 6090 
MachineName    : WL6090 
DisplayS/N    : 0253G020TG 
Terrainversion   : 5.3.843.843 
CAESTaskListDLLversion : 5.3.843.843 
ApplicationType   : Terrain/CAES Ultra 
OperatingSystem   : 1.04 
TotalRAMusedbyactivefiles : 339.72 kB 
FreeDiskSpace    : 6758 MB    Total Disk Space: 7076 MB 
CurrentServiceHours  : 314.41 
GPSReceiverSN    : 3351J508SP 
GPSReceiverType   : MS992 
NAVfirmwareversion  : 00506 
SIGfirmwareversion  : 00506 
ROMfirmwareversion  : 00425 

样的格式列表输出OUT-GridView的pciture enter image description here

+0

谢谢@LotPings。抱歉回复晚了。我现在正在查看它。 –

+0

这就是我正在寻找的!非常感谢你!!!! –

0

解析文档可以是一个有点讨厌,但上面是非常简单的。

$InputFile.replace("MB","MB`n") -split "\n" | 
    Select-String ":" | % { 
     $_.Line.Trim() -replace ":\s+","`t" 
    } | ConvertFrom-Csv -Delimiter "`t" -Header "Detail","Value" 

此获取输入一个字符串,然后:

  • 把一个换行符在MB值后,因为有多个在一行。
  • 只选择其中有一个:在其中,以排除垃圾和空白行。
  • 修剪的结果,并然后通过在与标签中间替换:____部分格式化的值成一个制表符分隔CSV。
  • 将其转换为包含标题的CSV以便于处理。

结果:

Detail       Value     
------       -----     
Current Local Time    Fri Jul 01 04:54:27 2016 
Current GMT Time    Thu Jun 30 20:54:27 2016 
Machine ID      6090      
etc... 

你可以得到一个长格式输出,那么通过使用此:

$c.Detail -join "`t" 
$c.Value -join "`t" 

希望这会有所帮助,我使用的代码(不包括MB - >MB\n部分)解析类似的日志文件少数几次。

+0

谢谢ConnorLSW。我会检查并尽快给您 –

+0

我这样做:'$ INPUTFILE = 'd:\ terrain_dia \ out.txt' $ InputFile.replace( “MB”, “MB'n”)-split“\ n “| Select-String“:”| %{。 $ _ Line.Trim()-replace “:\ S +”, “'T” } | ConvertFrom-Csv -Delimiter“'t”-Header“Detail”,“Value”'我得到如下结果:'Detail Value ------ ----- D:\ terrain_dia \ out.txt'我做错了什么?) –

+0

您需要执行'$ InputFile = Get-Content'D:\ terrain_dia \ out.txt'来将文本从文件中拉出来。 – ConnorLSW