c#:解析文本文件

本文关键字:文本 文件 | 更新日期: 2023-09-27 18:01:35

我有一个文本文件,文件的内容是这样的:

idiom: meaning
description.
o example1.
o example2.
idiom: meaning
description.
o example1.
o example2.
.
.
.

可以看到,该文件包含上述段落,每个段落都有一些我想提取的数据(注意,示例从o开始)。例如,我们有这些数据:

public class Idiom
{
    public string Idiom { get; set; }
    public string Meaning { get; set; }
    public string Description { get; set; }
    public IList<IdiomExample> IdiomExamples { get; set; }
}
public class IdiomExample
{
    public string Item { get; set; }
}

是否有任何方法提取该文件中的这些字段?任何想法?


文件可以是任何东西,比如习语和动词……例如,这就是我的模式例如:

little by little: gradually, slowly (also: step by step)
o Karen's health seems to be improving little by little.
o If you study regularly each day, step by step your vocabulary will increase.
to tire out: to make very weary due to difficult conditions or hard effort (also: to wear out) (S)
o The hot weather tired out the runners in the marathon.
o Does studying for final exams wear you out? It makes me feel worn out!

提前致谢

c#:解析文本文件

这是我的正则表达式为您的问题:

(?<section>(?<idiom>^.+?):(?<meaning>.+)['n](?<description>.*?)(?<examples>(?<example>o.+['s'r'n])+))

我稍微测试了一下,但我认为你还需要修正一些小问题。总的来说,它工作得很好。

这个正则表达式的设置:

RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.IgnorePatternWhitespace | RegexOptions.CultureInvariant

嗯,你有三种方法来处理你的文件。首先是使用正则表达式,它是开发速度最快、性能最慢的解决方案。第二个是将文本解析为字符串,并使用LINQ或任何您想要的东西。对我来说,这种方法有bug,不可伸缩等等,但它有更好的性能,如果你处理非常大的文件,这一点是至关重要的。第三种是使用正式语法和终端机器之类的东西……我从来没有实现过这样的东西,但我知道,它是快速的,很难开发和维护,所以我建议你使用regexp,然后迁移到另一种方法,如果性能将成为你的瓶颈

希望这对你有帮助!

你的例子没有描述,但是这个regexp接受可选的描述。它让你知道如何解析你的输入,而不是整个c#代码。

请看这个演示,看看Groups

(?smx)
^ 
([^:'n]+):'s*([^'n]+)
'n([^o].*?'n|)
(^o.*?)
(?='Z|^[^o:'n]+:)

之后:

  1. 组#1有成语

  2. 组#2有意义

  3. 组#3有描述如果存在

  4. 组#4有所有的例子

这个正则表达式不会把你的例子解析成几个例子,那是下一个工作。你也可能不喜欢一些换行符

这样应该可以工作。我还没有测试过,但稍加调试,我想它会起作用的。

我知道你把regex放在标签中,但这也是一种提取行的方法。

using ( var textReader = new StreamReader("idioms.txt") )
{
    var idioms = new List<Idiom>();
    string line;
    while ( ( line = textReader.ReadLine() ) != null )
    {
        var idiom = new Idiom();
        if ( line.StartsWith("idiom: ") )
        {
            idiom.Meaning = line.Replace("idiom: ", string.Empty);
            idiom.Description = textReader.ReadLine();
            while ( ( line = textReader.ReadLine() ) != null )
            {
                if ( line.StartsWith("o ") )
                    idiom.IdiomExamples.Add(new IdiomExample { Item = line.Replace("o ", string.Empty) });
                else break;
            }
            idioms.Add(idiom);
        }
    }
    ///idioms ready
}

类似这样的东西(没有测试,这只是一个建议)

RegEx r = new RegEx(@"Idiom:([^'n]+)'n([^o]+)(o([^o]+)o)*");