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

时间:2012-03-25 19:54:04

标签: sql-server powershell bcp

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

由于我想使用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"

我尝试过这样的事情:

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

但我仍然得到了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  

请注意,在EE0h,第一个字符为NULL,0x00。

6 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:7)

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

$stuff | Out-File $out_path -Encoding UTF8

另见this thread

答案 2 :(得分:3)

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

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

Get-Content "c:\temp\tablename.csv" -Encoding Byte | ? {$_ -ne 0x00} | Set-Content "c:\temp\tablename2.csv" -Encoding Byte

答案 3 :(得分:2)

使用'\ xnn'按十六进制表示匹配字符:

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

答案 4 :(得分:2)

-replace "`0", " "

这对我来说很合适。

答案 5 :(得分:0)

关闭Andy的回复和你的回复,看起来你要摆脱的'null'值实际上是“00”。

所以你想要这样做:

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

这将转换:

00000EE0h:00 2C 32

成:

00000EE0h:2C 32