【问题标题】:Split large text file into multiple smaller ones using text analysis/regex使用文本分析/正则表达式将大文本文件拆分为多个较小的文件
【发布时间】:2017-03-09 10:28:15
【问题描述】:

我有一个烦人的问题,即第三方向我提供了一个文件,该文件基本上是一组巨大的类(C# 供参考)。我现在已经对这个类进行了几次修订,出于某种未知原因,第三方开发人员将文件中的类从一个修订版移到另一个修订版。这使得处理对以前版本的任何更改都变得困难且耗时。

public class Abc
{
  ...
}

public class Xyz
{
  ...
}

因此,我希望能够将他们交付的文件拆分为多个文件(以他们的类命名,例如 Abc.cs、Xyz.cs 等)。我会有更多文件,但至少我可以轻松查看任何更改,因为我可以在交付的文件上运行相同的脚本,并且可以对生成的文件执行差异以确定对该特定类的任何修订.

我在使用 Powershell 和 Regex 方面都有经验,我认为这在 PS 中是可能的,但老实说,我的脑袋正在碰壁。在我有些蹩脚的尝试中,我设法从文件中提取了每个结束类括号 (}),仅此而已。我还尝试对"\r\npublic class ""\r\n}" (\r\npublic class(.*)\r\n}\r\n) 之间的所有内容进行正则表达式,但这要么导致仅输出第一个类,要么移动整个文件,要么根本不工作。这清楚地表明我没有迭代 public class 的实例,而且我的示例非常类似于更适合拆分 CSV 而不是多行解决方案的解决方案。

应该注意的是,在所有情况下,public class 声明和右括号都在新行上,因此不应该有任何边缘情况会出错。该文件不是特别大(Get-Content 读取它根本不需要时间。我最初的研究建议我使用StreamReader,但这对我的用例来说是不必要的。

任何正确方向的指针都将在此不胜感激。

在此先感谢

【问题讨论】:

  • 这可能是Roslyn 的工作。

标签: regex windows powershell scripting


【解决方案1】:

在行首由public class 分割:

(Get-Content r:\1.cs | Out-String) -split '(?:^|\r\n)public class\s+' -ne '' | 
    ForEach {
        $className = $_ -replace '(?s)^(\w+).*$', '$1'
        "public class $_" | Out-File "r:\$className.cs" -encoding UTF8
    }

调整:

在 PS3.0+ 中:使用 (Get-Content r:\1.cs -raw) 而不是 (Get-Content r:\1.cs | Out-String)
在任何 PS 中:[IO.File]::ReadAllText('r:\1.cs') 甚至更快。

【讨论】:

  • 谢谢你!我曾考虑只按public class 拆分,但它错过了上一行的[Serialization] 等类属性。但是,我可以用你提供的东西来处理。再次感谢您!
【解决方案2】:

假设您只想提取公共类,以下是我整理的可能对您有用的东西:https://regex101.com/r/urLWuz/2

(public\s*class\s*(\S*)\s*\{.*?(?:\}(?=\s*(?:(?:public\s*class)|$))))
  • ( - 开始捕获包含整个类的组

    • public\s*class\s*(\S*) - 匹配类声明和捕获名称。 \s 将匹配任何空格,\S 将匹配任何非空格
    • \s*\{ - 匹配类内容的开始大括号
    • .*? - 内部任何东西的惰性匹配。如果这是贪婪的,它将匹配所有类作为一个匹配项。
    • (?:\}(?=\s*(?:(?:public\s*class)|$))) - 使用非捕获组匹配结束类内容的大括号
      • \}(?=\s*(?:(?:public\s*class)|$)) - 使用正向前瞻匹配右大括号,断言右大括号后面是可选空格,后跟另一个类或文件末尾。如果不考虑文件结束的可能性,则不会捕获最后一个类。非捕获组用于与捕获分组。
  • ) - 关闭整个匹配类的捕获组

这应该捕获每个类以及类名。基本上,它通过检查大括号后面的类声明或文件末尾来知道哪个大括号是类的右大括号。

如果所有类都在一个命名空间内,则需要稍作修改。

【讨论】:

  • 谢谢!最终我没有使用它,但我以前不知道 regex101.com 这应该可以帮助我无穷无尽,因为我目前的首选正则表达式工具 - Regex Coach - 并不总是那么好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2014-01-30
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多