【问题标题】:PowerShell split not working using words (read from file)PowerShell 拆分无法使用单词(从文件中读取)
【发布时间】:2016-12-21 08:32:28
【问题描述】:

我正在尝试从文件中提取出现在特定单词模式之间的句子。目的是从文件中提取出现在第一对“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

【问题讨论】:

    标签: string powershell split


    【解决方案1】:

    使用Get-Content -Raw ... 将内容读取为一个字符串,而不是每行的字符串数组

    【讨论】:

    • 感谢 DAX,在 -raw 参数的帮助下,文件按预期读取。
    【解决方案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.
    

    您需要对引号进行转义,以便“bad”仍然是字符串的一部分。

    但是,当您从文件中读取时,引号已经是字符串的一部分:

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

    因为您没有在控制台中输入引号,所以不需要对它们进行转义。要向您展示您自己的代码,请检查您的临时文件的完整内容:

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

    我想不出你需要这样做的任何理由。也许如果您出于某种原因想要复制并粘贴到控制台中,仅此而已。

    现在这似乎可行,但这只是因为我假设您尝试运行的 SQL 查询不包含引号,虽然我不确定它们是否在 SQL 中使用,但如果您尝试它会引发错误,并且不管这是您不需要执行的额外步骤,因此您基本上可以废弃整个临时文件并直接从原始文件中读取。

    【讨论】:

    • 很好解释,非常感谢。 -Raw 参数就像魔术一样工作!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2022-06-10
    • 2019-05-02
    • 2013-05-31
    • 2017-04-15
    • 2022-12-19
    相关资源
    最近更新 更多