PowerShell拆分无法使用单词(从文件中读取)

时间:2016-08-15 05:52:57

标签: string powershell split

我试图从文件中提取出现在特定单词模式之间的句子。目的是从文件中提取出现在第一对'GO'字之间的句子。这里实现的逻辑是基于单词“GO”拆分文件,然后打印数组的第二个元素(在本例中以SET开头的句子)。但是,PowerShell无法识别分隔符(GO);相反,它似乎是将“新行”识别为分隔符,并且正在打印第二句。

请注意,我需要阅读该文件,然后完成提取。

文件内容

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 个答案:

答案 0 :(得分:3)

使用config.paperclip_defaults = { storage: :s3, s3_host_name: "s3-ap-northeast-1.amazonaws.com", #example s3_region: ENV['AWS_REGION'], s3_credentials: { bucket: ENV['S3_BUCKET_NAME'], access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'] } } 将内容读取为一个字符串,而不是每行的字符串数组

答案 1 :(得分: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开关时,Get-Content将整个文件作为带有换行符的单个字符串返回。

我要指出的另一件事是你正在逃避报价,但这不是必要的。您需要转义引号的原因是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中使用但是如果你试过它会引发错误,无论这是一个额外的步骤,你不需要这样做,你基本上可以废弃整个临时文件,直接从原始文件阅读。