Board logo

标题: [问题求助] 使用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

  1. 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
  1. $f=0
  2. gc aa.txt|%{
  3. 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;$_}
  4. }
复制代码

作者: 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


    单个#号的行后面还跟了空格
  1. $f=0
  2. gc aa.txt|%{
  3. 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;$_}
  4. $c=$_
  5. }
  6. $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
  1. $f=0
  2. gc aa.txt|%{
  3. 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;$_}
  4. }
复制代码

作者: 5i365    时间: 2022-1-16 22:30

回复 11# idwma


    真是太牛了,  我发贴前估计这问题还无解呢




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2