使用多个分隔符拆分文本

时间:2016-03-02 08:59:49

标签: c# text split logic

需要建议。考虑下面带有文本段落的示例文件。

1
Lorem ipsum dolor sit amet, cum at doming urbanitas mnesarchum. Eum ad paulo inermis. Iuvaret minimum mnesarchum ad mei. Dolores placerat pro ex.

Vel zril facete utamur et. Id dicam fuisset contentiones mea, vidisse sapientem consequuntur his ex. Vivendum liberavisse ut usu, mel habeo postea disputationi id. 
Timeam aliquid nec no, ex duo option dolorum appareat. Ut tota interesset vim, ne graeci principes sea. Mel et postulant repudiare, eos an populo appareat, 
qui placerat iudicabit instructior at. Qui sint malis an.


1 
2
Ne mutat putant omnium eos, cu duo malis molestie reprehendunt. Te duo adhuc posse graecis, inermis mediocrem sed te. 
Eam cu latine eruditi electram, populo nemore suscipit vim ei, hinc reformidans voluptatibus pri te. Ut suas sanctus epicurei eam, 
legimus luptatum ei duo. No mel recteque scriptorem referrentur, ne mel duis cetero consequat, id possit offendit mel.
2
3

3
4

Eu usu tamquam docendi, eum at facer semper sententiae, veritus deserunt ei vis. Id albucius insolens mea, sea ad amet nibh. 
Sed id epicuri luptatum liberavisse, mei etiam scripta no. Quod detracto ei qui, imperdiet posidonium in eos. 
4
:
:
N
:
N

这里的分隔符是段落本身的序列号。

(即)

  

[换行]号码[换行]段落[换行]号码[断行]

我可以通过哪些方法/方式更快地将这些段落拆分为单独的文件,而不是逐行迭代它们。

虽然我现在正在使用C#和SQL,但我也听说Phyton在这些类型的操作中要快得多。所以我也可以尝试其他任何选项。

编辑: 为了清楚起见,我以文本段落为例给出了它们。这些段落是其他模块的实际指令/输入。更清楚的是,这些段落将包含数字。

4 个答案:

答案 0 :(得分:1)

这对正则表达式来说是一个很好的工作。你可以这样做:

Regex regex = new Regex(@"(\b[0-9]+\b)(.*?)(\1)",RegexOptions.Singleline);
string s = ...
var result = regex.Matches(s)
                  .Cast<Match>()
                  .Select(m => m.Groups[2].Value.Trim(Environment.NewLine.ToCharArray()))
                  .ToList();
  • (\b[0-9]+\b):匹配单词边界,然后匹配任何数字后跟单词边界(防止数字在文本中间匹配,添加&#34; 1 1 1&#34;在第一段和结果保持不变)
  • (.*?):以非贪婪的方式匹配任何字符
  • (\1):匹配开头捕获的数字(为了安全起见,捕获将停留在段落中任意随机数的可能性较小)

Demo

结果将获取第二组(.*?)捕获的字符串,并从开头和结尾修剪换行符。

这将为List<string>提供元素:

result[0]

  

&#34; Lorem ipsum dolor坐在amet,暨在doming urbanitas mnesarchum。 Eum ad paulo inermis。 Iuvaret最小的mnesarchum ad mei。 Dolores placerat pro ex。

     

Vel zril facete utamur et。 Id dicam fuisset contentiones mea,vidisse sapientem consequuntur他的前任。 Vivendum liberavisse ut usu,mel habeo postea disputationi id。   Timeam aliquid nec no,ex duo选择dolorum dressat。 Ut tota interesset vim,ne graeci principes sea。 Mel et postulant repudiare,eos a populo appareat,   qui placerat iudicabit instructior at。 Qui sint malis an。&#34;

result[1]

  Ne p mutat putant omnium eos,cu duo malis molestie reprehendunt。 Te duo adhuc posse graecis,inermis mediocrem sed te。   Eam cu latine eruditi electram,populo nemore suscipit vim ei,hin reformidans voluptatibus pri te。 Ut suas sanctus epicurei eam,   legimus luptatum ei duo。没有mel recteque scriptorem referrentur,ne mel duis cetero consequat,id possit offendit mel。

等...

修改

如果要过滤掉空段落,可以在选择后执行.Where(str => !String.IsNullOrEmpty(str))。那么你只能得到3个结果。

答案 1 :(得分:0)

您是从文件或数据库中读取此内容吗?在任何情况下,如果这将存储在字符串中,那么您可以使用split方法:

String.Split Method

答案 2 :(得分:0)

您可以使用Regex.Split按模式进行拆分。如果段落中没有出现数字,您可以使用“[0-9] +”。

var passages = Regex.Split(text, "[0-9]+");

答案 3 :(得分:0)

在Python中,你可以很容易地做到这一点:

lines = filter(None, map(lambda l: l.strip(), open('text_file', mode='r').readlines()))
map(lambda item: open(item[0], 'w').write(item[1]), [lines[i:i + 2] for i in range(0, len(lines), 2)])

第一行将所有内容读入一个字符串列表,如下所示: [&#39; 1&#39;,&#39;第1段文字&#39;,&#39; 2&#39;,&#39;第2段文字&#39;,&#39; 3&#39;, &#39;第3段文字&#39;,...]

第二行占用列表中的每2个元素,并使用第一个元素作为文件索引,第二个元素作为写入文件的文本。

希望这有帮助。