首页 > 解决方案 > 使用 Powershell 脚本在 .txt 管道分隔的平面上删除 CR LF 不正确的分割线

问题描述

希望一切安好!从 Oracle PBCS 导出的平面文件存在一些回车问题,我遇到了一个棘手的问题。最终用户 - 在将数据输入 PBCS 时 - 通常会按下特定的数据字段输入屏幕。当数据被导出代表特定记录时,所有数据元素都代表该数据点(交叉点) - 像 SQL 记录一样思考 - 用户按下 Enter 的记录元素导致该记录在该点中断 - 移动其余部分该记录中的数据元素到下一行。这是非常糟糕的,因为每条记录必须具有相同数量的元素 - 导致映射中的下游问题。实际上,一个独特的记录变成了两个损坏的记录。

我需要一个 Powershell 脚本来查看不正确的 CR LF(Windows 系统)并修改每个唯一记录。但是,平面文件中的大多数记录都很好,因此代码必须能够区分“大部分好”和“非常坏”的情况。

我的平面文件是用管道分隔的,并且有一个标题元素。可能不需要考虑标头元素,因为我只是试图解决修复问题 - 解决方案可能会查看标头记录的属性值的数量,以确定如何使用管道分隔符根据属性计数格式化损坏的记录- 但不确定这是必要的。

老实说——我尝试了一些 Jython 脚本无济于事——所以我觉得我过去曾出于其他原因使用过几个 Powershell 脚本,我会再次使用它。我有一个用于 csv 文件的脚本的基础 - 但这并不完全有效。

$file = Get-Content 'E:\EPM_Cloud\Exports\BUD_PLN\Data\EXPORT_DATA_BUD_PLN.txt'
$file| Foreach-Object {

  foreach ($property in $_.PSObject.Properties) {
  $property.Value = ($property.Value).replace("`r","").replace("`n","")

  }
}

$file|out-file -append 'E:\EPM_Cloud\Exports\BUD_PLN\Data\EXPORT_DATA_BUD_PLN_FINAL.txt' 

如果我能让这段代码正常工作,这里有几个例子说明了之前和之后的情况。

这应该是一条记录 - 正如您看到的以“$43K from... 开头的那样,用户多次按下回车键。如您所见,它是用竖线分隔的 - 我使用数字行号向您展示我的意思,因为这是'不是记事本++。想法是这一切都应该是1。

Contract TBD|#missing|#missing|#missing|#missing|ORNL to Perform Radio-Chemical  (RCA) Measurements|#missing|#missing|#missing|#missing|"$43K from above
$92,903 
$14,907 

The current $150K to be reprogrammed to XXX, plus another $150K from Fuel Fac for this item to be reprogrammed to RES."|#missing|#missing|#missing|"Summary|X0200_FEEBASED|No_BOC|O-xxxx-B999|xx_xxx_xx_xxx|Plan|Active|FY19|BegBalance"|COMMIT

这就是输出的样子(我附上了屏幕截图)。都在1。

Contract TBD|#missing|#missing|#missing|#missing|ORNL to Perform Radio-Chemical  (RCA) Measurements|#missing|#missing|#missing|#missing|"$43K from above $92,903 $14,907 The current $150K to be reprogrammed to XXX, plus another $150K from Fuel Fac for this item to be reprogrammed to RES."|#missing|#missing|#missing|"Summary|X0200_FEEBASED|No_BOC|O-xxxx-B999|xx_xxx_xx_xxx|Plan|Active|FY19|BegBalance"|COMMIT

在其他情况下,换行只中断一次 - 全部由用户按 Enter 的次数定义。在此处输入图像描述

正如您在数据图像中看到的 - 您会看到线是如何分裂的 - 这就是 powershell 的重点。正如您在该屏幕截图旁边看到的那样 - 其他行很好。

标签: powershellflat-filecarriage-return

解决方案


因此,在本地检查后,您应该能够将文件作为 csv 导入,然后遍历所有内容并从每条记录的每个属性中删除 CRLF,然后输出到新文件(或相同,但输出到新文件更安全)文件)。

$Records = Import-Csv C:\Path\To\File.csv -Delimiter '|'
$Properties = $Records[0].psobject.properties.name
ForEach($Record in $Records){
    ForEach($Property in $Properties){
        $Record.$Property = $Record.$Property -replace "[\r\n]"
    }
}
$Records | Export-Csv C:\Path\To\NewFile.csv -Delimiter '|' -NoTypeInfo

推荐阅读