有一个文件C:\ Density.txt,其中定期写入四个值。为了处理和进一步分析,我只需要第四个符号,密度:。
文件处理方法如下所示。是否有可能使用正则表达式获得密度:值?
文件示例英语:
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。有什么方法可以添加解决方案代码吗?
$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()发布于 2019-06-11 08:19:27
这应该可以做到:
$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/cm3或g / cm3结尾的值,下面的代码可以获得英文和俄文版本的值:
$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”字面意思)
发布于 2019-06-11 08:24:13
您可以使用积极的展望:
$Text = Get-Content C:\Density.txt
($Text | Select-String -Pattern "[0-9\.].+?(?=( g \/ cm3))" -AllMatches).Matches.Value输出:
1111.586
1112.586
1113.586发布于 2019-06-14 10:55:48
谢谢你的帮助。以下是完整的决议:
$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
}
}https://stackoverflow.com/questions/56538985
复制相似问题