2017-07-25 21 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