Как удалить NULL char (0x00) из объекта в PowerShell - PullRequest
5 голосов
/ 25 марта 2012

У меня есть файл .CSV, который я создал с помощью утилиты BULK-COPY командной строки SQL Server для выгрузки нескольких таблиц базы данных.

Поскольку я хочу импортировать эти файлы .CSV с помощью Powershell и конвертироватьв хороший отчет с помощью командлета format-table, у меня проблемы с выравниванием столбцов и т. д.потому что некоторые столбцы содержат NULL из SQL Server.У меня нет возможности сначала преобразовать NULL из SQL Server;из-за способа экспорта таблицы в CSV.

Поэтому я хотел бы удалить все NULL из файла .CSV, прежде чем пытаться передать его в командлет format-table.

Мой основной код ниже:

$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.

Ответы [ 6 ]

12 голосов
/ 26 марта 2012

После небольшой игры я наконец-то понял, что этот синтаксис работает:

(Get-Content "C:\temp\tablename.csv") -replace "`0", "" | Set-Content "C:\temp\tablename.csv"
7 голосов
/ 04 мая 2016

Все представленные ответы являются обходными путями и не решают основной проблемы, которая заключается в том, что powershell по умолчанию использует кодировку utf-16 (поэтому вы получаете NULL, то есть 0x00 между всеми символами).Решение состоит в том, чтобы заставить PowerShell использовать utf-8:

$stuff | Out-File $out_path -Encoding UTF8

Также см. этот поток

3 голосов
/ 25 марта 2012

Обновление - Теперь, когда я понимаю, что вы подразумеваете под NULL (hex 0x00), я могу предложить вам другой подход.

Вы можете просто отфильтровать эти байты, прочитав файлв двоичном виде, как это:

Get-Content "c:\temp\tablename.csv" -Encoding Byte | ? {$_ -ne 0x00} | Set-Content "c:\temp\tablename2.csv" -Encoding Byte
2 голосов
/ 09 августа 2012
-replace "`0", " "

У меня в текстовом файле это работало просто замечательно.

2 голосов
/ 26 марта 2012

Используйте '\ xnn' для сопоставления символов по их шестнадцатеричному представлению:

(get-content c:\temp\tablename.csv) -replace '\x00','' | set-content c:\temp\tablename.csv
0 голосов
/ 26 марта 2012

Если исходить из ответа Энди и вашего ответа, то похоже, что значение 'null', от которого вы хотите избавиться, на самом деле в тексте равно "00".

Так что вы хотите сделать это вместо:

(Get-Content "C:\temp\tablename.csv") -replace " 00 ", " " | Set-Content "C:\temp\tablename.csv"

Это преобразует:

00000EE0h: 00 2C 32

* * 1009 в: * * 1010

00000EE0h: 2C 32

...