【发布时间】: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