2016-08-15 76 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