Как да премахнете NULL char (0x00) от обект в PowerShell

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

Тъй като искам да импортирам тези .CSV файлове с помощта на Powershell и да ги конвертирам в хубав отчет с помощта на cmdlet format-table, имам проблеми с подреждането на колони и т.н. защото някои колони съдържат NULL от SQL Server. Нямам опция първо да конвертирам NULL от SQL Server; поради начина, по който експортирам таблицата в CSV.

Ето защо бих искал да премахна всички NULL от .CSV файла, преди да се опитам да го прехвърля в кратката команда за форматна таблица.

Основният ми код е по-долу:

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


person user500741    schedule 25.03.2012    source източник
comment
NULL стойността във вашето заглавие във връзка с маркера sql-server беше много подвеждаща, така че промених леко заглавието, за да премахна неяснотата. Не съм сигурен дали сега не звучи тромаво или неудобно, така че не се колебайте да го редактирате отново, както сметнете за добре.   -  person Andriy M    schedule 26.03.2012


Отговори (6)


След малко игра наоколо, най-накрая разбрах, че този синтаксис работи:

(Get-Content "C:\temp\tablename.csv") -replace "`0", "" | Set-Content "C:\temp\tablename.csv"
person user500741    schedule 26.03.2012
comment
Ако можех да направя публикация, бих го направил. Използвах скрипт на PowerShell, за да модифицирам XML файл с манифест на Android за целите на управлението на версиите и тази грешка HEX 0x00 беше супер разочароваща. Благодаря! - person srbrills; 05.10.2017

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

$stuff | Out-File $out_path -Encoding UTF8

Вижте също тази тема

person user2426679    schedule 04.05.2016
comment
Съгласен съм с @user2426679. Този отговор трябва да се приеме. Използвах string.Replace и след това записах с Out-File. Проблемът беше с кодирането и уточняването на UTF8 работи като чар. - person Mayur Dhingra; 17.02.2017
comment
Благодаря ! Имах подобен проблем с npm анализатор, въпреки че автоматично генерираният xml беше настроен на ‹?xml версия=1.0 кодиране=UTF-8?› по време на създаването, изпълнението на горното поправи небелите знаци в моя шестнадесетичен изглед. И със сигурност по-добър начин от замяната на отделни знаци. - person Vinay; 16.05.2018

Актуализация – След като виждам какво имате предвид под NULL (hex 0x00), мога да ви дам друг подход.

Можете просто да филтрирате тези байтове, като прочетете файла като двоичен по следния начин:

Get-Content "c:\temp\tablename.csv" -Encoding Byte | ? {$_ -ne 0x00} | Set-Content "c:\temp\tablename2.csv" -Encoding Byte
person Andy Arismendi    schedule 25.03.2012
comment
Здравейте - благодаря за бързия отговор. Това, което казахте, има смисъл; въпреки това опитах и ​​двата ви метода и полученият резултат все още съдържа 0x00 NULL. Ето фрагмент от изхода. Забележете на ред EE0h, първият символ е 00. ` 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,9 9,/acb43_0 00000EF0h: 31 2F 34 33 62 61 6C 61 6E 63 65 73 2E 67 69 66 1/43balances.gif` - person user500741; 26.03.2012
comment
--Съжалявам, опитах се да редактирам оригиналния въпрос и изглежда не мога да накарам форматирането да остане в режим на блокиране. - person user500741; 26.03.2012
comment
@user500741 Не забравяйте, това е просто текст, така че какъвто и буквален текст да премахнете, ще бъде това, което ще използвате като първи аргумент на оператора -replace. Промених малко примерите си, за да можете по-лесно да видите това. - person Andy Arismendi; 26.03.2012
comment
Благодаря за отговора -- абсолютната стойност, когато я гледате в непечатаем вид. Опитът да е 00 също не работи. Шестнадесетичният дъмп, който предоставих, го показва като 0x00, а страната на ASCII просто го показва като непечатаем символ, използвайки .. - person user500741; 26.03.2012

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

(get-content c:\temp\tablename.csv) -replace '\x00','' | set-content c:\temp\tablename.csv
person mjolinor    schedule 26.03.2012

-replace "`0", " "

Това работи добре за мен в текстов файл.

person psstarkey    schedule 08.08.2012

Излизайки от отговора на Анди и вашия отговор, изглежда, че „нулевата“ стойност, от която искате да се отървете, всъщност е „00“ в текста.

Така че бихте искали да направите това вместо това:

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

Това ще преобразува:

00000EE0h: 00 2C 32

в:

00000EE0h: 2C 32

person Huon Imberger    schedule 26.03.2012
comment
Не, това беше шестнадесетичен дъмп на файла, за да покаже как изглежда всеки байт. NotePad++, например, го показва като NULL. Ако го погледна в шестнадесетичен изглед, той се показва като 0x00 байт или . тъй като не е за печат. - person user500741; 26.03.2012