[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

  1. gc aa.txt|%{if($_ -match '^#(?!.*<)'){$a+=$_}else{$a;$_;$a=$null}}
复制代码

TOP

本帖最后由 5i365 于 2022-1-16 08:14 编辑

回复 2# idwma


    感谢帮忙 !!!
⑥ 被合并了, 不应该合并
② 合并后应该单独一行
合并后的行, 行与行交接的地方需要删除#,只留1个空格
⑤ 合并后应该变为 # This is the code generated by the online tool:

TOP

回复 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. }
复制代码

TOP

本帖最后由 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

应该①②分别合并, ⑥不合并

TOP

回复 5# 5i365


    上面的例子是可以的,把不能的文本发一下

TOP

回复 6# idwma


    难道又是版本的问题?
https://wss1.cn/f/7dmrks8nxd6 复制链接到浏览器打开

TOP

本帖最后由 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
复制代码
1

评分人数

    • 5i365: 牛X, 感谢技术 + 1

TOP

回复 8# idwma


    不知道代码适应性如何, 以后我多试几个例子, 有情况,  再前来反馈, 再次感谢!

TOP

回复 8# idwma


    忘了一点:
将合并后的行, 在其下面,再复制一份, 即克隆行

TOP

回复 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. }
复制代码

TOP

回复 11# idwma


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

TOP

返回列表