首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取file.Regular表达式

读取file.Regular表达式
EN

Stack Overflow用户
提问于 2019-06-11 07:56:10
回答 3查看 58关注 0票数 0

有一个文件C:\ Density.txt,其中定期写入四个值​​。为了处理和进一步分析,我只需要第四个符号,密度:。

文件处理方法如下所示。是否有可能使用正则表达式获得密度:值?

文件示例英语:

代码语言:javascript
复制
Solid density
Mass in the air:
           23.384 (1) g
Mass in liquid:
           23.383 (3) g
Solid volume:
               0.001 cm3
 
  Density:
          1111.586 g / cm3
           ==============
Solid density
Mass in the air:
           23.384 (1) g
Mass in liquid:
           23.383 (3) g
Solid volume:
               0.001 cm3
 
  Density:
          1112.586 g / cm3
           ==============
Solid density
Mass in the air:
           23.384 (1) g
Mass in liquid:
           23.383 (3) g
Solid volume:
               0.001 cm3
 
  Density:
          1113.586 g / cm3
           ==============

我试图添加您的解决方案代码,但是出现了一个错误。我需要锁定用于写入的文件(ScalesM)和reading.Having获得的值,我需要逐行将结果写入另一个文件OutFile。有什么方法可以添加解决方案代码吗?

代码语言:javascript
复制
$ScalesM = [System.io.File]::Open('C:\DensityNT.txt', 'Open', 'ReadWrite', 'None') 
$OutFile = [System.io.File]::Open('C:\\InfinityDensity.txt', 'append', 'Write', 'None')

            $ScalesM2 = New-Object System.IO.StreamReader($ScalesM)
            $text = $text + $ScalesM2.ReadToEnd()
  # Next sring Give my the Error -
$text = ($text | Select-String -Pattern "[0-9\.].+?(?=( g\/cm3))" -AllMatches).Matches.Value 

            $data = $enc.GetBytes($text) 
            $OutFile.write($data,0,$data.length) 


            $ScalesM.SetLength(0)
            $ScalesM.Close()
            $OutFile.Close()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-11 08:19:27

这应该可以做到:

代码语言:javascript
复制
$txt = Get-Content 'PATH TO THE DENSITY.TXT FILE'
$regex = [regex] '(?m)Density:\s+(?<density>.+)'
$match = $regex.Match($txt)
while ($match.Success) {
    $match.Groups['density'].Value
    $match = $match.NextMatch()
} 

威尔输出

1111.586 g/ cm3 1112.586 g/ cm3 1113.586 g/ cm3

更新

在我的机器上,带有值Плотность:的正则表达式不起作用。由于您想要的值是以g/cm3g / cm3结尾的值,下面的代码可以获得英文和俄文版本的值:

代码语言:javascript
复制
$txt = Get-Content 'PATH TO THE DENSITY.TXT FILE' -Encoding UTF8
$regex  = [regex]'(?<density>\d+(?:\.\d+)?\s+g\s*/\s*cm3)'
$match = $regex.Match($txt)
$result = while ($match.Success) {
    $match.Groups['density'].Value
    $match = $match.NextMatch()
} 

# output on screen:
$result

# output to file
$result | Set-Content 'D:\Densities.txt'

Regex详细信息:

(?匹配下面的正则表达式,并将其匹配捕获到具有名称“density”\d的反向引用中,在一次和无限次之间匹配单个数字0..9 +,尽可能多次返回(贪婪) (?:匹配下面的正则表达式。匹配字符“。字面上\d匹配一个单一数字0..9 +之间的一次和无限次,尽可能多的次数,回馈需要(贪婪)?在0到1次之间,尽可能多次地返回,按需要返回(贪婪) \s匹配一个“空格字符”(空格、制表符、换行等)+在一次和无限次之间,尽可能多次,尽可能多次返回(贪婪)g匹配字符“g”字面意思是匹配一个字符,即“空格、制表符、换行符”(空格、制表符、换行符),*在零次和无限次之间,尽可能多次地返回(贪婪) \/匹配字符“/”按字面意思匹配一个“空格字符”(空格、制表符、换行等)*在零次和无限次之间,尽可能多次,尽可能多次返回(贪婪) cm3匹配字符“cm3”字面意思)

票数 0
EN

Stack Overflow用户

发布于 2019-06-11 08:24:13

您可以使用积极的展望:

代码语言:javascript
复制
$Text = Get-Content C:\Density.txt
($Text | Select-String -Pattern "[0-9\.].+?(?=( g \/ cm3))" -AllMatches).Matches.Value

输出:

代码语言:javascript
复制
1111.586 
1112.586 
1113.586
票数 1
EN

Stack Overflow用户

发布于 2019-06-14 10:55:48

谢谢你的帮助。以下是完整的决议:

代码语言:javascript
复制
$TValue = ""
$enc    = [system.Text.Encoding]::UTF8
$NL     = [System.Environment]::NewLine

while ($countI=1) {

try {
    $ScalesM = [System.io.File]::Open('C:\IN.txt', 'Open', 'ReadWrite', 'None') 
    $OutFile = [System.io.File]::Open('C:\OUT.txt', 'append', 'Write', 'None')

    $ScalesM2 = New-Object System.IO.StreamReader($ScalesM)
    $text = $ScalesM2.ReadToEnd()

         [regex]::matches($text, ':\s*(\d+\.?\d*)\s+g\s*/\s*cm3') | %{
        $TValue = $TValue +  $_.Groups[1].value + $NL
                                                                  }

        $data = $enc.GetBytes($TValue) 
        $OutFile.write($data,0,$data.Length)
        $ScalesM.SetLength(0) 
        $ScalesM.Close()
        $OutFile.Close()

        Wait-Event -Timeout 1

    }

catch {
    echo ″Some error was found.″
            $ScalesM.Close()
            $OutFile.Close()
    Wait-Event -Timeout 0.5
}

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56538985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档