В Windows мне приходит отчет с сервера MS SQL со встроенными дублирующимися переводами строк, которые вызывают ошибки при чтении в LOAD DATA INFILE в mySQL в среде Windows. Я исправляю это, используя три однострочника Strawberry Perl в скрипте Powershell.
Соглашение Windows \ n \ n 'распознается Strawberry Perl, и это его выходной формат. Однако я не мог заставить Perl распознавать пустые строки с помощью одного перевода строки 0x0a, поскольку аромат Perl Strawberry всегда интерпретировал бы это как новую строку и включал бы ее в вывод.
Мое решение состояло в том, чтобы простозаменить все символы перевода строки 0x0a строкой, которая вряд ли появится в содержимом:
<* script is Powershell, initialize source file name*>
$myLoginCSV = 'User%5FProfile%5FReport.csv'
<* convert linefeed (0a) chars into string LINEFEEDCHAR *>
$perlarg='-i.p.bak -p -e "s/\x0A/LINEFEEDCHAR/g"'
perl $perlarg $myLoginCSV
<* de-duplicate linefeeds*>
$perlarg='-i.p.bak -p -e "s/(LINEFEEDCHAR){2,}/LINEFEEDCHAR/g"'
perl $perlarg $myLoginCSV
<* restore the 0a linefeed characters by substituting for LINEFEEDCHAR *>
$perlarg='-i.p.bak -p -e "s/LINEFEEDCHAR/\x0a/g"'
perl $perlarg $myLoginCSV
Я пытался сделать это одной строкой, но не смог понять, как это сделать. Strawberry Perl интерпретирует перевод строки с фиксированным поведением, чтобы сделать его совместимым с Windows. Этот «три лайнера» работает хорошо и быстро. Попытка сделать это с помощью собственного регулярного выражения Powershell была более чем в 10 раз медленнее.
В частности, в среде Windows Strawberry Perl, есть ли способ сделать это менее чем за три строки?
Это не высокий приоритет. Один урок, который я извлек из этого, заключается в том, что решение регулярных выражений, использующее Strawberry Perl в Windows, может иметь многострочное решение, но при этом быть быстрым. В будущем я не буду настолько привязан к настоящему «однострочному» решению, когда пару дополнительных строк выполнят свою работу.