2013-11-04 25 views
0

我正在編寫一個腳本,它從二進制文件讀取,轉換爲ASCII,提取/分隔2列,並將其輸出到txt。介紹解析循環/重構難看的代碼

我看了this後實現二進制> ASCII步驟,但是,以它在我的腳本中實現的方式,它似乎只對文件中的第一行執行上述過程。

我該如何重寫這個循環遍歷文件中的所有行?

我的代碼如下。

# run the command script to extract the file 
script.cmd 

# Read the entire file to an array of bytes. 
$bytes = [System.IO.File]::ReadAllBytes("filePath") 

# Decode first 'n' number of bytes to a text assuming ASCII encoding. 
$text = [System.Text.Encoding]::ASCII.GetString($bytes, 0, 999999)| 

    # only keep columns 0-22; 148-149; separate with comma delimiter 
    %{ "$($_[$0..22] -join ''),$($_[147..147] -join '')"} | 

    # convert the file to .txt 
    set-content path\file.txt 

此外,什麼是寫這部分,因此它只是讀取字符串的長度,而不是拉動高達999999個字節的更優雅的方式?

$text = [System.Text.Encoding]::ASCII.GetString($bytes, 0, 999999)| 
+1

如果你假設它是ASCII編碼的數據,你爲什麼要讀取它作爲字節,然後轉換爲文本,而不是做ReadAllText開始? – mjolinor

+0

@mjolinor - 文件以二進制形式啓動,然後轉換爲ASCII。我這樣做是因爲我想在腳本的第一步中當我們從FTP拉文件時防止數據損壞。 –

+1

由於它是二進制數據,行如何分隔? – mjolinor

回答

1

您不需要指定索引和計數。只需使用

[System.Text.Encoding]::ASCII.GetString($bytes).Split("`r`n",[System.StringSplitOptions]::RemoveEmptyEntries) 

[System.Text.Encoding]::ASCII.GetString([System.IO.File]::ReadAllBytes("filePath")).Split("`r`n",[System.StringSplitOptions]::RemoveEmptyEntries) 

我不知道你爲什麼要讀它以字節爲單位,當你可以簡單地使用Get-Content

+0

你的第二個建議工作(謝謝),但我仍然需要遍歷文件中的所有行。目前只有第一行被解析。 –

+1

沒有看到第一個問題。由於您是基於字符索引提取文本,因此您需要使用'foreach /(%)'進行循環。您可以使用正則表達式而不是字符索引,但除非文件太大以至於需要幾分鐘才能處理,否則它不會有太大的區別。循環播放並不差。另一種方法是讀取所有文本,然後解析(逐行),這可能會更慢。 –

+0

謝謝你的建議。我對豪華遊戲非常陌生,所以我不知道如何實現循環。我仍然在網上尋找如何實施,但如果你能告訴我,我會很樂意欣賞它。 –