我有一个使用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。
答案 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
答案 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