标题: [问题求助] 使用Powershell合并符合条件的多行 [打印本页]
作者: 5i365 时间: 2022-1-15 20:43 标题: 使用Powershell合并符合条件的多行
本帖最后由 5i365 于 2022-1-15 20:47 编辑
想知道powershell能否合并符号条件的多行,
详细描述如下:
#开头的一行, 若其段前和段后有单独一个#字符的行, 则此三行合并为一行, 如图中的⑤
至少连续两行, #开头的行:
如果它们的前面和后面没有单独一个#字符的行, 则合并为一行, 如图中的①②③④
否则则不要合并, 如图中的⑥
至少连续两行, #开头, >结尾的段落: 不合并, 如图中的⑦
-------------------------------------------------------------------------
行合并的格式如下: [即:行与行相接的地方,删除# 留一个空格]
合并前:
# The first row contains the column names.
# This file is available at:
# /testData/sample.csv
合并后:
# The first row contains the column names. This file is available at: /testData/sample.csv
-------------------------------------------------------------------------
另外, 也想将上面合并后的行, 在其下面,再复制一份, 即克隆行
规律就是这些, 感觉有点复杂, 请求高手支招, 非常感谢
示例文本:
Add-Type -Path "C:\chilkat.dll"
# This example program loads a file (sample.csv)
# that contains this content:
#
# year,color,country,food
# 2001,red,France,cheese
# 2005,blue,"United States",hamburger
# 2008,green,Italy,pasta
# 1998,orange,Japan,sushi
#
# The first row contains the column names.
# This file is available at:
# /testData/sample.csv
$csv = New-Object Chilkat.Csv
# Prior to loading the CSV file, indicate that the 1st row
# should be treated as column names:
$csv.HasColumnNames = $true
# We have the following XML.
# Copy this XML into the online tool at Generate Parsing Code from XML
# as a starting point for accessing the data..
# <?xml version="1.0" encoding="utf-8"?>
# <root>
# <html>
# <head>
# <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
# </head>
# <body text="#000000" bgcolor="#FFFFFF">
# <div>
# </div>
# </body>
# </html>
# </root>
#
# This is the code generated by the online tool:
#
$xml = New-Object Chilkat.Xml
作者: idwma 时间: 2022-1-15 21:26
- gc aa.txt|%{if($_ -match '^#(?!.*<)'){$a+=$_}else{$a;$_;$a=$null}}
复制代码
作者: 5i365 时间: 2022-1-16 08:11
本帖最后由 5i365 于 2022-1-16 08:14 编辑
回复 2# idwma
感谢帮忙 !!!
⑥ 被合并了, 不应该合并
② 合并后应该单独一行
合并后的行, 行与行交接的地方需要删除#,只留1个空格
⑤ 合并后应该变为 # This is the code generated by the online tool:
作者: idwma 时间: 2022-1-16 19:50
回复 3# 5i365 - $f=0
- gc aa.txt|%{
- if($_ -match '^#$'){[array]$a+=$_;$f++}elseif(($f -gt 0) -and $f -lt 2){$a+=$_}elseif($f -eq 2){if($a.count -le 3){'#'+($a -join '' -replace '#')}else{foreach($i in $a){'#'+($i -replace '#')}};$f=0;rv a;$a+=$_}elseif(($f -eq 0) -and $_ -match '^#(?!.*<)'){$a+=$_}else{if(($a -match '#') -and $a -ne $null){'#'+($a -replace '#')}elseif($a -ne $null){$a};$a=$null;$_}
- }
复制代码
作者: 5i365 时间: 2022-1-16 20:07
本帖最后由 5i365 于 2022-1-16 20:08 编辑
回复 4# idwma
上面图中 ①⑥② 被合并成了如下
# This example program loads a file (sample.csv) that contains this content: year,color,country,food 2001,red,France,cheese 2005,blue,"United States",hamburger 2008,green,Italy,pasta 1998,orange,Japan,sushi The first row contains the column names. This file is available at: http://www.chilkatsoft.com/testData/sample.csv
应该①②分别合并, ⑥不合并
作者: idwma 时间: 2022-1-16 20:36
回复 5# 5i365
上面的例子是可以的,把不能的文本发一下
作者: 5i365 时间: 2022-1-16 21:12
回复 6# idwma
难道又是版本的问题?
https://wss1.cn/f/7dmrks8nxd6 复制链接到浏览器打开
作者: idwma 时间: 2022-1-16 21:20
本帖最后由 idwma 于 2022-1-16 21:23 编辑
回复 7# 5i365
单个#号的行后面还跟了空格- $f=0
- gc aa.txt|%{
- if($_ -match '^#\s*$'){[array]$a+=$_;$f++}elseif(($f -gt 0) -and $f -lt 2){$a+=$_}elseif($f -eq 2){if($a.count -le 3){'#'+($a -join '' -replace '#')}else{foreach($i in $a){'#'+($i -replace '#')}};$f=0;rv a;$a+=$_}elseif(($f -eq 0) -and $_ -match '^#(?!.*<)'){$a+=$_}else{if(($a -match '#') -and $a -ne $null){'#'+($a -replace '#')}elseif($a -ne $null){$a};$a=$null;$_}
- $c=$_
- }
- $c
复制代码
作者: 5i365 时间: 2022-1-16 21:28
回复 8# idwma
不知道代码适应性如何, 以后我多试几个例子, 有情况, 再前来反馈, 再次感谢!
作者: 5i365 时间: 2022-1-16 21:31
回复 8# idwma
忘了一点:
将合并后的行, 在其下面,再复制一份, 即克隆行
作者: idwma 时间: 2022-1-16 22:17
回复 10# 5i365 - $f=0
- gc aa.txt|%{
- if($_ -match '^#\s*$'){if(($f -eq 0) -and $a -ne $null){$b='#'+($a -join '' -replace '#');$b;$b;$a=$null};[array]$a+=$_;$f++;if($f -eq 2){if($a.count -le 3){$b='#'+($a -join '' -replace '#');$b;$b}else{foreach($i in $a){'#'+($i -replace '#')}};$f=0;rv a}}elseif(($f -gt 0) -and $f -lt 2){$a+=$_}elseif(($f -eq 0) -and $_ -match '^#(?!.*<)'){$a+=$_}else{if(($a -match '#') -and $a -ne $null){$b='#'+($a -replace '#');$b;$b};$a=$null;$_}
- }
复制代码
作者: 5i365 时间: 2022-1-16 22:30
回复 11# idwma
真是太牛了, 我发贴前估计这问题还无解呢
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |