Powershell-将.txt数据输出到CSV

Powershell-将.txt数据输出到CSV,powershell,csv,export-to-excel,export-to-csv,Powershell,Csv,Export To Excel,Export To Csv,我希望您能帮助PowerShell初学者将数据从.txt文件输出到CSV 要记住的事情: 每个文本文件包含多个需要提取的条目 端子始终为A,后跟3位数字 查询者总是以C开头,但长度可以不同 文件中有两种出生日期模式 这些空格在txt中不是以制表符分隔的,它们的间距也不相同 这是我想要的CSV输出(抱歉,我没有足够的代表来上传图片!) data.txt文件示例 START TERMINAL USER ENQUIRER

我希望您能帮助PowerShell初学者将数据从.txt文件输出到CSV

要记住的事情:

  • 每个文本文件包含多个需要提取的条目
  • 端子始终为A,后跟3位数字
  • 查询者总是以C开头,但长度可以不同
  • 文件中有两种出生日期模式
  • 这些空格在txt中不是以制表符分隔的,它们的间距也不相同
这是我想要的CSV输出(抱歉,我没有足够的代表来上传图片!)

data.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 = @()
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" 

我用了不同的方法

  • 将文件拆分为以虚线和分隔符分隔的部分
  • 3个不同的正则表达式,使用命名(捕获组)对每种线型的属性进行grep。
    第一个
  • 所有找到的属性都存储在中间$Row对象中,如果所有正则表达式匹配,则在
    $Csv


看起来您需要在导出到csv之前添加一个select对象-尝试以下操作:
$csv | select{l=“Date”e={$.Date},@{l=“Time”;e={$.Time}}导出csv$TodaysCSV-NoTypeInformation
{l='Date};e={$.Date<这是不必要的。
-属性日期、时间
足够了。谢谢各位,我对Don的建议有了进一步的了解,当我使用您的建议时,它仍然将数据作为系统输出。对象[]在单元格中,我现在有了这个信息,几乎就在那里。我只需要将两个结果分成单独的行。下面是数据(如果我在导出csv中添加-delimiter“”,它不喜欢它。如果我添加-delimiter“`t”它将所有数据放在一列中。仅供参考,数据用一个空格分割,即2017年5月29日2017年5月29日为-分隔符“”“空间”的有效表示形式?太棒了!正则表达式来拯救。哇!!这太完美了!所有数据的格式都很好,所有内容都很好。与用户交谈,这些日志相关,并且球门柱移动得非常轻微…有一些结果他们需要查询器字段在A999之后需要整行(随着日志的变化)A999是唯一保持不变的东西,而且我从日志顶部删除了一行文本,其中有用户ID-行是“为操作员886667选择的”,这将始终是6位数字,并且措辞相同。我尝试将其作为另一个正则表达式添加,但没有得到任何结果。您的问题已经相当复杂。在我的观点中ion它满足了您的要求。您可以遵守此要求。现在进行更改,在CA75849之后,有一个相当大的差距,这应该是Inquirer?的一部分,以匹配,直到行尾$RE1需要另一个设置
(?m)
多行匹配行开始
^
或行结束“$”。我将合并此更改,但请尝试自己进行进一步的更改-这不是脚本编写服务。我喜欢这种类型的任务,但不期望我付出更多努力。完全理解,非常感谢您为我的屏幕所做的一切我将尝试这些更改,并将其标记为答案。我想知道您是否可以帮助处理用户ID,从周一起我一直在努力将其发送到文本文件中的REGEX用户ID。它位于顶部部分,仅显示一次,因为该文件是该用户的日志。其他字段的问题是y是自由文本,因此用户可能输入错误的用户ID。我尝试了许多不同的正则表达式模式,但没有选择该行。我需要从选定的运算符891234中提取891234。文本文件在这里(称为891111.txt)[链接]在此,考虑使用有序哈希表创建对象的速度要比添加成员快得多,例如:$hash=[ordered]@{PropertyName=$Value;$Prop2=$value2};新对象-TypeName PSObject-Property$hash另一个我很难习惯的好做法…谢谢提醒,我稍后再添加。好的一点!
$TopLine = $XmlDocument | Select-String "A999" 
## 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