String PowerShell拆分无法使用字(从文件读取)
我试图从一个文件中提取出现在特定单词模式之间的句子。目的是从文件中提取出现在第一对“GO”单词之间的句子。这里实现的逻辑是基于单词“GO”拆分文件,然后打印数组的第二个元素(本例中以SET开头的句子)。但是,PowerShell无法识别分隔符(GO);相反,它似乎将“新行”识别为分隔符,并打印第二句话 请注意,我需要读取文件,然后完成提取 文件内容String PowerShell拆分无法使用字(从文件读取),string,powershell,split,String,Powershell,Split,我试图从一个文件中提取出现在特定单词模式之间的句子。目的是从文件中提取出现在第一对“GO”单词之间的句子。这里实现的逻辑是基于单词“GO”拆分文件,然后打印数组的第二个元素(本例中以SET开头的句子)。但是,PowerShell无法识别分隔符(GO);相反,它似乎将“新行”识别为分隔符,并打印第二句话 请注意,我需要读取文件,然后完成提取 文件内容 $path = 'D:\Scripts' $deltaFile = 'GoSampleFile.txt' $modifiedDelta = 'GoS
$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
家庭地址“TJ单向”
办公地址“C公司双向”
去
设置ANSI_空值、ANSI_填充、ANSI_警告、ARITHABORT、CONCAT_空值、QUOTED_标识符ON;
将数字_ROUNDABORT设置为OFF;
去
家庭住址“TJ单向”
办公地址“C公司双向”
去
:错误退出时
去
我的代码
$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
使用
Get Content-Raw…
将内容读取为一个字符串,而不是每行的字符串数组可能是一个新的答案,因为还有另一个问题,我将提供更多细节
正如DAX所说,您需要使用-Raw
,因为Get内容返回一个字符串数组,每行一个。当您在其上使用-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
您需要转义引号,以便“bad”仍然是字符串的一部分
但是,从文件读取时,引号已经是字符串的一部分:
$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中使用,但如果您尝试,它将抛出一个错误,不管怎样,这是一个额外的步骤,您不需要这样做,这样您基本上可以废弃整个临时文件,直接从原始文件中读取。解释得很好,非常感谢。-Raw参数像魔术一样工作!再次感谢。感谢DAX,在-raw参数的帮助下,文件按预期读取。