Устранение неправильной линии разбиения CR LF на .txt квартире с разделителями трубы с помощью скрипта Powershell - PullRequest
0 голосов
/ 26 июня 2019

Надеюсь, все хорошо! Я столкнулся с небольшой проблемой с плоским файлом, экспортируемым из Oracle PBCS, с некоторыми проблемами возврата каретки. Конечные пользователи - при вводе данных в PBCS - часто нажимают на экране ввода определенного поля данных. Когда экспортируются данные, представляющие определенную запись со всеми элементами данных, представляющими эту точку данных (пересечение) - представьте себе, как запись SQL - элемент записи, в котором пользователь нажал клавишу ввода, вызывает разрыв этой записи в этой точке - сдвигая остальную часть элементы данных в этой записи на следующую строку. Это очень плохо, так как каждая запись должна иметь одинаковое количество элементов - вызывая проблемы в процессе преобразования. Фактически одна уникальная запись становится двумя битыми записями.

Мне нужен скрипт 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 от ... пользователь нажал несколько раз клавишу ввода. Как вы видите, это разделитель трубы - я использую числовые номера строк, чтобы показать вам, что я имею в виду поскольку это не блокнот ++. Идея в том, что все это должно быть только на 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

В других случаях строка разрывается только один раз - все определяется только тем, сколько раз пользователь нажимает. введите здесь описание изображения

Как вы видите на изображении данных - вы видите, как линия разделяется - это точка PowerShell. Как вы видите рядом с этим снимком экрана - другие строки просто в порядке.

1 Ответ

0 голосов
/ 26 июня 2019

Таким образом, после локальной проверки вы сможете импортировать файл как 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
...