Как удалить символ NULL (0x00) из объекта в PowerShell
У меня есть файл .CSV, который я создал с помощью служебной программы BULK-COPY командной строки BCP SQL Server, чтобы сбросить кучу таблиц базы данных.
Поскольку я хочу импортировать эти файлы .CSV с помощью Powershell и преобразовать их в хороший отчет с помощью командлета format-table, у меня возникают проблемы с выравниванием столбцов и т. Д. потому что некоторые столбцы содержат NULL из SQL Server. У меня нет возможности сначала конвертировать NULL из SQL Server; из-за того, как я экспортирую таблицу в CSV.
Поэтому я хотел бы удалить все NULL из файла .CSV, прежде чем пытаться передать его в командлет format-table.
- Поддержка Unicode для Invoke-Sqlcmd в PowerShell
- Действия PowerShell напрямую или SQL-запросов PowerShell
- Выделение отдельных объектов из SQL с помощью SMO
- Переменная Escape в sqlcmd / Invoke-SqlCmd
- Как добавить пользователя к роли сервера SQL с помощью powershell?
Мой базовый код приведен ниже:
$CSV=import-csv "c:\temp\tablename.csv" $CSV | format-table -autosize | out-string -width 4096 >"C:\TEMP\tablename.txt"
Я попытался сделать что-то вроде:
$CSV | -replace($null,"") | format-table -autosize | out-string -width 4096 > "C:\TEMP\tablename.txt"
но я все еще получаю NULL.
Кто-нибудь знает, как удалить NULL из моего CSV, чтобы я мог отобразить хороший табличный отчет. Я хочу получить эти .TXT-отчеты, импортированные в SVN, но NULL вызовут у меня проблемы, а также перечеркивают отчеты.
CSV-файл, как показано в шестнадцатеричном редакторе:
00000EA0h: 31 38 39 2C 31 31 39 2C 37 35 29 2C 77 68 69 74 189,119,75),whit 00000EB0h: 65 2C 77 68 69 74 65 2C 2C 2C 2C 2C 2C 2C 2C 2C e,white,,,,,,,,, 00000EC0h: 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C ,,,,,,,,,,,,,,,, 00000ED0h: 2C 2C 0D 0A 61 63 62 34 33 5F 30 31 2C 4F 4E 2C ,,..acb43_01,ON, 00000EE0h: 00 2C 32 37 2C 39 39 2C 2F 61 63 62 34 33 5F 30 .,27,99,/acb43_0 00000EF0h: 31 2F 34 33 62 61 6C 61 6E 63 65 73 2E 67 69 66 1/43balances.gif
Обратите внимание, что в EE0h первый символ равен NULL, 0x00.
- Разница между настройками PowerShell / SQL Server в / инструментах?
- Как искать строку во всех хранимых процедурах через SQL Powershell?
- Развертывание dacpac через Powershell вызвало ошибку: «Невозможно определить личность домена»
- Как получить основную информацию о реплике для группы доступности SQL с помощью powershell
- Обнаружение установки SQL Server в сети - как их обнаружить?
- создать таблицу с записями на сервере sql с powershell: что лучше?
- Powershell - сопоставление пользователей SQL Server 2012
- Powershell не будет запускать вложенный SQL-запрос
После немного поиграть, я наконец понял, что этот синтаксис работал:
(Get-Content "C:\temp\tablename.csv") -replace "`0", "" | Set-Content "C:\temp\tablename.csv"
Обновление. Теперь, когда я вижу, что вы подразумеваете под NULL (hex 0x00
), я могу дать вам другой подход.
Вы можете просто отфильтровать этот байт, прочитав файл как двоичный:
Get-Content "c:\temp\tablename.csv" -Encoding Byte | ? {$_ -ne 0x00} | Set-Content "c:\temp\tablename2.csv" -Encoding Byte
Используйте '\ xnn' для сопоставления символов по шестнадцатеричному представлению:
(get-content c:\temp\tablename.csv) -replace '\x00','' | set-content c:\temp\tablename.csv
Все представленные ответы являются обходами и не затрагивают основную проблему, а именно, что powershell по умолчанию использует кодировку utf-16 (вот почему вы получаете NULL, то есть 0x00 между всеми символами). Решение состоит в том, чтобы сказать powershell, чтобы использовать utf-8:
$stuff | Out-File $out_path -Encoding UTF8
Смотрите также эту тему
Отправляясь от ответа Энди и вашего ответа, похоже, что «нулевое» значение, которое вы хотите избавиться, на самом деле «00» в тексте.
Поэтому вы хотите сделать это вместо этого:
(Get-Content "C:\temp\tablename.csv") -replace " 00 ", " " | Set-Content "C:\temp\tablename.csv"
Это будет конвертировать:
00000EE0h: 00 2C 32
в:
00000EE0h: 2C 32
-replace "`0", " "
Это очень сработало для меня в текстовом файле.