2016-08-15 43 views
2

我想從文件中提取出現在單詞的特定模式之間的句子。目的是從文件中提取出現在第一對「GO」字之間的句子。這裏實現的邏輯是基於單詞'GO'分割文件,然後打印數組的第二個元素(在本例中以SET開頭的句子)。但是,PowerShell沒有識別分隔符(GO);相反,它似乎認識到「新行」作爲分隔符,並正在打印第二個句子。PowerShell拆分不能使用單詞(從文件中讀取)

請注意,我需要閱讀文件,然後完成提取。

內容文件

Home address "TJ One way" 
Office address "C company Two way" 
GO 
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON; 
SET NUMERIC_ROUNDABORT OFF; 
GO 
Home address "TJ One way" 
Office address "C company Two way" 
GO 
:on error exit 
GO 

我的代碼

$path = 'D:\Scripts' 
$deltaFile = 'GoSampleFile.txt' 
$modifiedDelta = 'GoSampleFile1.txt' 

New-Item -path $path -Name $modifiedDelta -ItemType file -Force 

#Split for each appearing GO, after escaping the double quotes 
(Get-Content $path'\'$deltaFile).replace('"', '`"') | Set-Content $path'\'$modifiedDelta 
$separator = 'GO' 
$modifiedDeltaString = Get-Content $path'\'$modifiedDelta 

#Write-Host $modifiedDeltaString 
#Write-Host $separator 

$goArray = $modifiedDeltaString -split "GO", 0, "SimpleMatch" 
Write-Output $goArray[1] 

#Housekeeping of the temporary file 
Remove-Item $path'\'$modifiedDelta 

回答

2

陣列的也可能是一個新的答案,因爲還有一個問題,我會提供更多詳情。

由於DAX表示您需要使用-Raw,因爲Get-Content返回一個字符串數組,每行一個字符串。當你在其上使用-split時,每個元素都被分開處理。以下陣列

[0] "Testing" 
[1] "This is a test" 
[2] "'tis still a test" 

$array -split "is", 0, "SimpleMatch" 

[0] "Testing" 
[1] "Th" 
[2] " " 
[3] " a test" 
[4] "'t" 
[5] " still a test" 

上使用時當您使用-raw開關

例如,獲取內容返回整個文件作爲一個字符串用換行符。

我要指出的另一件事是你在逃避報價,但這不是必要的。你需要轉義引號的原因是如此PowerShell不會假設你終止字符串:

$t = "This is a "bad" test" 
> At line:1 char:18 
+ $t = "This is a "bad" test" 
+     ~~~~~~~~~~ 
Unexpected token 'bad" test"' in expression or statement. 

你需要逃避的報價讓「壞」仍然是字符串的一部分。

但是當你從文件中讀取的報價已經是字符串的一部分:

Get-Content C:\test.txt 
> This is a "bad" test 

因爲你沒有輸入引號到控制檯,他們並不需要進行轉義。要使用自己的代碼告訴你,檢查你的臨時文件的全部內容:

Home address `"TJ One way`" 
Office address `"C company Two way`" 

我想不出任何理由,你將需要做這個。也許如果你想複製並粘貼到控制檯出於某種原因,但就是這樣。

這可能似乎現在工作,但只是因爲我假設你正在嘗試運行的SQL查詢不包含引號,雖然我不確定它們是否在SQL中使用它會拋出一個錯誤,如果你試過了,不管這是多少步,你都不需要這樣做,所以你基本上可以取消整個臨時文件並直接從原始文件中讀取。

+0

很好解釋,非常感謝。 -Raw參數的工作方式非常神奇!再次感謝。 –

3

使用Get-Content -Raw ...讀取的內容作爲一個字符串而不是串的每行

+0

感謝DAX,在-raw參數的幫助下,文件按預期讀取。 –

+0

只有今天,得到了投票權,做到了:) –

+0

哈哈謝謝:) – DAXaholic

相關問題