我有一个文本 (.txt) 文件,看起来像这样:
人员类型 人员姓名 人员编号 状态 主管姓名 应付工资名称 应用程序 供应商名称 开始日期 结束日期 是否归档 机构 D'Cunha, Yionue 123456 未输入 Power, Mehash 项目 合同承包商 SUPPLIER_1 10-DEC-16 16-DEC-16 否 员工 Vughila, Proshont132456 工作中 Miro, Profal 公司-abcde月薪支付 INPayroll 10-DEC-16 16-DEC-16 否 月薪 员工 Diiri, Maaor 113456 未输入 Kargannkir, Bivnath 公司-abcde月薪支付 INPayroll 10-DEC-16 16-DEC-16 否 月薪 员工 Kimit, Gongobhar111111 工作中 Chondorkor, Avissku 公司-abcde项目 INProjects 10-DEC-16 16-DEC-16 否 月薪 员工 Kalvornu, Churali110077 工作中 Kindipur, Barinakir 公司-abcde月薪支付 INPayroll 10-DEC-16 16-DEC-16 否 月薪 机构 Dhilorii, Bohishik100009 未输入 Nook, 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 的评论后,我尝试了这个:
# 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文件。我是不是在某个地方漏掉了什么?