2016-12-05 50 views
0

我试图从TCP套接字中检索一些数据并将其写出到文件中。用于文本输出的TCP套接字数据清理

我能够检索数据正常,但我需要“消毒它”。

我收到的数据包含控制代码以标记报告的开始以及每条记录之间。它似乎也有CRLF代码之间的NULL字符。

我的数据看起来像这样在编辑器(我已经屏蔽值):

#########- #  L#########L ##############L     LLLLLL LLLLLLLL          #,###.## ##/##/## ##/##/##       # 

#########- #  L#########L ##############L     LLLL LL LLLLLLL         ###,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLLL           ##,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLL LLLLLLLL          #,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLL LLLL LLLLLL LLLLL        #,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLLL LLLLLLL LLLLLL LLLLL      #,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLL LLLLL LLLLLL LLL       #,###.## ##/##/## ##/##/##     ###### 

*#########- #  L#########L ##############L     LLLLLL LLLLL LLLLLL LLL        #,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLLLLLLL LLLLLL LLLLL       #,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLL LLLLL LLLLLL LLL       #,###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLL LLL LLLL           ###.## ##/##/## ##/##/##     ###### 

#########- #  L#########L ##############L     LLLLLLL L LLLLLL LLL        ##,###.## ##/##/## ##/##/##     ###### 

    ######-##  L#########L ##############L     LLLL LLLLLLLL          ##,###.## ##/##/## ##/##/##     ###### 

    ######-##  L#########L ##############L     LLLLL LLLLLLLLLL         ##,###.## ##/##/## ##/##/##     ###### 

    ######-##  L#########L ##############L     LLLL LLL           ##,###.## ##/##/## ##/##/##     ###### 

期待有一个额外的回车我无法摆脱的(末尾)这将是罚款,和行结尾是这样的十六进制编辑器

00 20 00 0D 00 0D 00 0A 00

这是我应得给我在哪里。

$new = $outputBuffer.Replace('[^\p{L}\p{Nd}]', '') 

$str = $new.split("`n") 

$myArray = @() 

foreach ($line in $str) { 
    $item = $line.trim([char]0x0003,[char]0x0002,[char]0x0001,[char]0x0000) 

    if ($item -like "Out of*") {break} 

    if ($item -ne "") { 
     $myArray += $item 
     } 
} 

$myArray | Out-File test.aud 

“Out of *”break是我终止循环的地方,因为这表示我关心的数据的结束。向数组中添加行时的“Trim”正在处理标记报告开始/结束的控制代码,但不包括NULL。

我已经尝试了几个小时的研究,无法找到一种方法来纠正这些行结束。

谢谢

+0

如果您的数据不被屏蔽,这将更容易回答。有什么办法可以发布更有用的东西吗?理想情况下,有足够的数据可以测试您正在运行的代码。 –

+0

我绝对会发布更好的例子,除了这是检查审计数据,因此敏感。我找到了解决方法,我也发布了。我确定有更好的方法.. – hallert

+0

很高兴你能工作 –

回答

0

彼时我做这个

与写出来修复它:

$myArray | Out-File dat.tmp 

然后回读中,其中固定线路的结局:

Get-Content dat.tmp | Set-Content $myVar".tmp" 

但是,这造成了每条记录之间的额外线条(尽管我现在的线条结束了真正的CRLF),所以我也读入/出一次,但这次只选择有效行:

Select-String -Pattern '[^\s]' -Path $myVar".tmp" | ForEach-Object {$_.Line} | Set-Content -Path $myVar".aud" 

然后我清理了我的临时文件有:

Remove-Item dat.tmp 
Remove-Item $myVar".tmp" 

我敢肯定有必须是一个更好的方法来做到这一点,但这是现在工作。