【问题标题】:Parse a text file and save to .csv解析文本文件并保存到 .csv
【发布时间】:2017-05-04 15:48:48
【问题描述】:

我有一个如下所示的文本 (.txt) 文件:

人员 人员姓名 人员审批主管 工资单名称 申请 供应商 开始日期 结束日期 存档
类型 编号 状态 名称 名称


Agency D'Cunha, Yionue 123456 NOT ENTERED Power, Projects CONTRACT
承包商 Mehash SUPPLIER_1
                                                                                                 10 月 16 日 16 月 16 日 否
员工 Vughila, 132456 WORKING Miro, Company-abcde INPayroll 10-DEC-16 16-DEC-16 否
          Proshont Profal 月刊
                                                                                                    10 月 16 日 16 月 16 日 否
员工 Diiri, Maaor 113456 未进入 Kargannkir,Company-abcde INPayroll
                                                比夫纳月刊
                                                                                                 10 月 16 日 16 月 16 日 否
员工 Kimit, Gongobhar111111 WORKING Chondorkor,Company-abcde INProjects 10-DEC-16 16-DEC-16 否
                                                阿维斯库月刊
员工 Kalvornu, 110077 WORKING Kindipur, Company-abcde INPayroll 10-DEC-16 16-DEC-16 否
          Churali Barinakir 月刊
Agency Dhilorii, 100009 NOT ENTERED Nook, 项目合同
承包商Bohishik Lurukont SUPPLIER_2

我从软件生成的报告中获取此文件。我想解析文件并将数据导出到 CSV。我尝试了this,但这并没有帮助,因为我的数据结构非常不同。

然后我尝试了这个:

$input = Get-Content "C:\Users\user.name\Desktop\GBS\text_file.txt"  

$data = $input[1..($input.Length - 1)]

$maxLength = 0

$objects = foreach ($record in $data) {
    $split = $record -split "\s{2,}|\t+"
    if ($split.Length -gt $maxLength) {
        $maxLength = $split.Length
    }
    $props = @{}
    for ($i=0; $i -lt $split.Length; $i++) {
        $props.Add([String]($i+1), $split[$i])
    }
    New-Object -TypeName PSObject -Property $props
}

$headers = [String[]](1..$maxLength)

$objects | 
    Select-Object $headers | 
    Export-Csv -NoTypeInformation -Path "C:\Users\user.name\Desktop\GBS\out.csv"

但这搞砸了每一行的第二行。问题是在原始文本文件中,每隔一行也是第一行的一部分。在某些情况下,甚至第三行也是第一行数据的一部分。

如果我可以提供任何信息来更好地表达我的问题,请告诉我。


在@Ansgar 的 cmets 之后,我尝试了这个:

# read text file into single string and remove header
$rawText = Get-Content 'C:\path\to\input.txt' | Out-String

# split string into individual records
$data = $rawText -replace "`r" -split '\n\n+' | Select-Object -Skip 1

$parsedData = foreach ($record in $data) {
    $prop = @{}
    $record -split '\n' | ForEach-Object {
        $prop['PersonType'] += $_.Substring(0, 10).Trim()
        $prop['PersonName'] += $_.Substring(10, 16).Trim()
        $prop['PersonNumber'] += $_.Substring(26, 9).Trim()
        $prop['ApprovalStatus'] += $_.Substring(35, 13).Trim()
        $prop['Supervisor'] += $_.Substring(48, 11).Trim()
        $prop['PayrollName'] += $_.Substring(59, 16).Trim()
        $prop['ApplicationName'] += $_.Substring(75, 13).Trim()
        $prop['Supplier'] += $_.Substring(88, 9).Trim()
        $prop['StartDate'] += $_.Substring(97, 12).Trim()
        $prop['EndDate'] += $_.Substring(109, 9).Trim()
        $prop['Archived'] += $_.Substring(118, 8).Trim()
    }

    New-Object -Type PSObject -Property $prev
}

$parsedData | Export-Csv 'C:\path\to\output.txt' -NoType

但现在我在目标文件夹中得到了一个空白的输出 CSV 文件。我是否在某处遗漏了什么?

【问题讨论】:

  • 如果您能掌握生成报告的原始数据,您的情况会更好。这样,您就不必撤销报告生成器对数据所做的操作。报告生成器可能正在尝试节省报告中的空间,并使其更易于阅读。这两个目标都在阻碍你。
  • 您好 Walter,感谢您的及时回复。这是主要问题之一。我无法获取报告或以任何方式修改报告。它生成这些报告,并以 .txt 格式给我每周转储文件。我只是在这里复制粘贴了 .txt 文件中的部分数据。
  • 我刚刚意识到您的个人记录没有用空行分隔,所以我的建议根本行不通。此外,看起来任意字段可以在下一行具有值或完全为空。您首先需要做的是定义标准,您可以通过这些标准以编程方式区分新记录和连续记录,否则这将永远行不通。

标签: powershell csv parsing


【解决方案1】:

我有一个解决方案,但是...
它使用两个拆分,第一个采用单词 (Person|Agency|Employee)
拆分记录(存在需要 if 的缺陷),
第二个在换行符处拆分,然后解析偏移量+长度。
由于样本数据的不一致,这也不完美。

$InFile = 'Q:\Test\2016-12\19\41225200.txt'
$OutFile= 'C:\path\to\output.txt'

$Delimiter = '(Person|Agency|Employee)'
#'$Escaped   = [regex]::Escape($Delimiter)
$Split     = "(?!^)(?=$Delimiter)"

$parsedData = (Get-Content $InFile -Raw) -split $Split | 
    ForEach-Object {
        $prop = @{}
        If ($_.Length -ge 30 ) {
            ForEach ($Line in $_.split("`n")) {
                $Line+=" "*130
                $prop['PersonType']      += $Line.Substring( 0, 10).Trim()
                $prop['PersonName']      += $Line.Substring(10, 16).Trim()
                $prop['PersonNumber']    += $Line.Substring(26,  9).Trim()
                $prop['ApprovalStatus']  += $Line.Substring(35, 13).Trim()
                $prop['Supervisor']      += $Line.Substring(48, 11).Trim()
                $prop['PayrollName']     += $Line.Substring(59, 16).Trim()
                $prop['ApplicationName'] += $Line.Substring(75, 12).Trim()
                $prop['Supplier']        += $Line.Substring(87, 10).Trim()
                $prop['StartDate']       += $Line.Substring(97,  9).Trim()
                $prop['EndDate']         += $Line.Substring(108, 9).Trim()
                $prop['Archived']        += $Line.Substring(117, 8).Trim()
            }
        }
        New-Object -TypeName PSObject -Property $prop
}
$parsedData

输出

Supervisor      : ApplicatioName
ApplicationName : t Date End DName
Archived        :
PersonType      : Person   AType
PersonName      : pproval     Supe
Supplier        : ate Archiv
StartDate       : ed
ApprovalStatus  : yroll NameStatus
PayrollName     : n Supplier  Star
PersonNumber    : rvisor PaNumber
EndDate         :


Supervisor      : Power,Mehash
ApplicationName : Projects
Archived        : No
PersonType      : AgencyContractor
PersonName      : D'Cunha, Yionue
Supplier        : CONTRACTSUPPLIER_1
StartDate       : 10-DEC-16
ApprovalStatus  : NOT ENTERED
PayrollName     :
PersonNumber    : 123456
EndDate         : 16-DEC-16


Supervisor      : Miro,Profal
ApplicationName : Payroll
Archived        : NoNo
PersonType      : Employee
PersonName      : Vughila,Proshont
Supplier        :
StartDate       : 10-DEC-1610-DEC-16
ApprovalStatus  : WORKING
PayrollName     : Company-abcde INMonthly
PersonNumber    : 132456
EndDate         : 16-DEC-1616-DEC-16

我的 export-csv 尝试也是空的。

【讨论】:

  • 谢谢!这真的很有帮助。我仍在努力,一旦找到答案就会发布。与此同时,非常感谢!我为迟到的回复道歉,我不在城里。
猜你喜欢
  • 2020-11-07
  • 2013-02-28
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多