[英]Powershell - Outputting .txt data to CSV
我希望您可以幫助PowerShell初學者將.txt文件中的數據輸出到CSV。
要記住的事情:
這是我想要的CSV輸出(道歉我沒有足夠的代表來上傳圖片!)
+------------+------+----------+----------+-------------------+----------+
| Date | Time | Terminal | Enquirer | Enquiry | DOB |
+------------+------+----------+----------+-------------------+----------+
| 29/05/2017 | 1227 | A999 | CA75849 | DOE/JOHN | / /1988 |
+------------+------+----------+----------+-------------------+----------+
| 29/05/2017 | 1424 | A999 | CA75849 | SMITH/SIMON/PETER | / /1967 |
+------------+------+----------+----------+-------------------+----------+
| | | | | | |
+------------+------+----------+----------+-------------------+----------+
數據.txt文件的示例
START TERMINAL USER ENQUIRER TERMINAL IP
========================================================================================================================
29/05/17 1227 A999 CA75849 8875849 OCBA NCPS RBC/12/1960
SEARCH REF NAME : DOE/JOHN PAGE CODE =
DATE OF BIRTH : / /1988
========================================================================================================================
29/05/17 1424 A999 CA75849 8875849 OCBA NCPS RBC/60/2111
SEARCH REF NAME : SMITH/SIMON/PETER CHAPTER CODE =
DATE OF BIRTH : / /1967
========================================================================================================================
請不要因為我的廢話Powershell腳本而暈倒。
我設法獲得的最好的是擁有正確的信息,但是單元格中的'System.Object []'而不是實際的結果字符串。
$XmlDocument = Get-Content -Path "C:\Script Projects\Log\880006.txt"
$TodaysCSV = "C:\Script Projects\Log\880006.csv"
$TopLine = $XmlDocument | Select-String "A1"
$Enquiry = $XmlDocument | Select-String "Search"
$DOB = $XmlDocument | Select-String "BIRTH"
$toptop = $topline -split " "
$Date = $toptop | Select-String -Pattern "^\d{2}/\d{2}/\d{2}$"
$Time = $toptop | Select-String -Pattern "^\d{4}$"
$Terminal = $toptop | Select-String -Pattern "^A\d{3}$"
$Enquirer = $toptop | Select-String -Pattern "C\w\d{5}"
$csv = New-Object -TypeName PSObject
Add-Member -InputObject $csv -MemberType NoteProperty -Name "Date" -Value $Date
Add-Member -InputObject $csv -MemberType NoteProperty -Name "Time" -Value $Time
Add-Member -InputObject $csv -MemberType NoteProperty -Name "Terminal" -value $Terminal
Add-Member -InputObject $csv -MemberType NoteProperty -Name "Enquirer" -value $Enquirer
Add-Member -InputObject $csv -MemberType NoteProperty -Name "Enquiry" -value $Enquiry
Add-Member -InputObject $csv -MemberType NoteProperty -Name "DOB" -value $DOB
$csv | Export-Csv $TodaysCSV -NoTypeInformation
我得到了這個輸出
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
| Date | Time | Terminal | Enquirer | Enquiry | DOB |
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
| System.Object[] | System.Object[] | System.Object[] | System.Object[] | System.Object[] | System.Object[] |
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
| | | | | | |
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
| | | | | | |
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
我也嘗試過這種方式,但我只得到日期或玩耍我可以獲得所有數據,但只能在單列中
$Total2 = "$date2", "$time2", "$Terminal2", "$Enquirer", "$Enquiry"
$Columns = "Date", "Time", "Terminal", "Enquirer", "Enquiry"
$total2 | ConvertFrom-Csv -Header $Columns| export-csv $TodaysCSV -NoTypeInformation
但是不記得我是怎么做到的,如果我從該文件導入PowerShell並導出為CSV,我仍然不會讓我水平顯示它。
我設法得到的最好的是這個
Date
----
29/05/17
29/05/17
Time
----
1227
1424
Terminal
--------
A999
A999
Enquirer
--------
CA75849
CA75849
Enquiry
-------
SEARCH REF NAME : DOE/JOHN CHAPTER CODE =
SEARCH REF NAME : SMITH/SIMON/PETER CHAPTER CODE =
預先感謝您的幫助!
我用了不同的方法,
$Csv
## Q:\Test\2018\07\06\SO_51209341.ps1
$FileIn = '.\SO_51209341_data.txt'
$TodayCsv = '.\SO_51209341_data.csv'
$RE1 = [RegEx]'(?m)(?<Date>\d{2}\/\d{2}\/\d{2}) (?<Time>\d{4}) +(?<Terminal>A\d{3}) +(?<User>C[A-Z0-9]+) +(?<Enquirer>.*)$'
$RE2 = [RegEx]'\s+SEARCH REF\s+NAME : (?<Enquiry>.+?) (PAGE|CHAPTER) CODE ='
$RE3 = [RegEx]'\s+DATE OF BIRTH : (?<DOB>[0-9 /]+?/\d{4})'
$Sections = (Get-Content $FileIn -Raw) -split "={30,}`r?`n" -ne ''
$Csv = ForEach($Section in $Sections){
$Row= @{} | Select-Object Date,Time,Terminal,User,Enquirer,Enquiry,DOB
$Cnt = 0
If ($Section -match $RE1){++$Cnt
$Row.Date = $Matches.Date
$Row.Time = $Matches.Time
$Row.Terminal = $Matches.Terminal
$Row.User = $Matches.User
$Row.Enquirer = $Matches.Enquirer.Trim()
}
If ($Section -match $RE2){++$Cnt
$Row.Enquiry = $Matches.Enquiry
}
If ($Section -match $RE3){++$Cnt
$Row.DOB = $Matches.DOB
}
if ($Cnt -eq 3){$Row}
}
$csv | Format-Table
$csv | Export-Csv $Todaycsv -NoTypeInformation
示例輸出修訂版
> . Q:\Test\2018\07\06\SO_51209341.ps1
Date Time Terminal User Enquirer Enquiry DOB
---- ---- -------- ---- -------- ------- ---
29/05/17 1227 A999 CA75849 8875849 OCBA NCPS RBC/12/1960 DOE/JOHN / /1988
29/05/17 1424 A999 CA75849 8875849 OCBA NCPS RBC/60/2111 SMITH/SIMON/PETER / /1967
這里的問題是您需要在導出之前將對象轉換為字符串。
要使代碼正常工作,您可以稍微修改對象創建:
$csv = @()
for ($i = 0;$i -lt $Date.Length; $i++) {
$obj = New-Object -TypeName PSObject
Add-Member -InputObject $obj -MemberType NoteProperty -Name "Date" -Value $Date[$i]
Add-Member -InputObject $obj -MemberType NoteProperty -Name "Time" -Value $Time[$i]
Add-Member -InputObject $obj -MemberType NoteProperty -Name "Terminal" -value $Terminal[$i]
Add-Member -InputObject $obj -MemberType NoteProperty -Name "Enquirer" -value $Enquirer[$i]
Add-Member -InputObject $obj -MemberType NoteProperty -Name "Enquiry" -value $Enquiry[$i]
Add-Member -InputObject $obj -MemberType NoteProperty -Name "DOB" -value $DOB[$i]
$csv += $obj
}
這里的問題是你應該創建一個數組對象,同時你應該創建對象數組。 這就是為什么在導出時你得到System.Object[]
而不是期望值。
注意 :看看你粘貼的代碼和文件格式。 這一行:
$TopLine = $XmlDocument | Select-String "A1"
應該
$TopLine = $XmlDocument | Select-String "A999"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.