如何从PowerShell中的对象中删除NULL char(0x00)

use*_*741 6 sql-server powershell bcp

我有一个.CSV文件,我使用SQL Server的BCP命令行BULK-COPY实用程序创建,以转储一堆数据库表.

由于我想使用Powershell导入这些.CSV文件,并使用format-table cmdlet将它们转换为一个漂亮的报告,我遇到列排列等问题.因为某些列包含来自SQL Server的NULL.我没有选择先从SQL Server转换NULL; 由于我将表格导出为CSV的方式.

因此,我想在尝试将其传递到format-table cmdlet之前从.CSV文件中删除所有NULL.

我的基本代码如下:

$CSV=import-csv "c:\temp\tablename.csv"
$CSV | format-table -autosize | out-string -width 4096 >"C:\TEMP\tablename.txt"
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

$CSV | -replace($null,"") | format-table -autosize | out-string -width 4096 > "C:\TEMP\tablename.txt"
Run Code Online (Sandbox Code Playgroud)

但我仍然得到NULL.

有谁知道如何从我的CSV中删除NULL,以便我可以显示一个很好的表格报告.我想把这些.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  
Run Code Online (Sandbox Code Playgroud)

请注意,在EE0h,第一个字符是NULL,0x00.

use*_*741 13

经过一段时间的游戏,我终于发现这个语法有效:

(Get-Content "C:\temp\tablename.csv") -replace "`0", "" | Set-Content "C:\temp\tablename.csv"
Run Code Online (Sandbox Code Playgroud)


use*_*679 9

所有提交的答案都是解决方法,并没有解决核心问题,即powershell默认使用utf-16编码(这就是为什么你得到NULL,即所有字符之间的0x00).解决方案是告诉powershell使用utf-8:

$stuff | Out-File $out_path -Encoding UTF8

另见这个帖子


小智 5

-replace "`0", " "
Run Code Online (Sandbox Code Playgroud)

这在文本文件中对我来说效果很好。


And*_*ndi 4

更新- 现在我明白了 NULL (十六进制)的意思,0x00我可以给你另一种方法。

您可以通过将文件读取为二进制来过滤掉这些字节,如下所示:

Get-Content "c:\temp\tablename.csv" -Encoding Byte | ? {$_ -ne 0x00} | Set-Content "c:\temp\tablename2.csv" -Encoding Byte
Run Code Online (Sandbox Code Playgroud)