【问题标题】:What is a way to extract data from this file type?什么是从这种文件类型中提取数据的方法?
【发布时间】:2012-05-16 17:04:04
【问题描述】:

我必须从文本文件中提取时间和坐标(东和北)数据。我想遍历它并使用包含的所有数据填充 3 个并行数组,直到我到达 EOF。我已经用 XML 完成了这项工作,但这次有点不同。我可以补充一下,这是一个用于 CC 视频文件的 SMI 文件。我将在下面发布一个示例:

<SAMI>
<HEAD>
    <STYLE TYPE="Text/css">
    <!--
        P {margin-left: 29pt; margin-right: 29pt; font-size: 24pt; text-align: center; font-family: Tahoma; font-weight: bold; color: #FF0000; background-color: #000000;}
        .SUBTTL {Name: 'Subtitles'; Lang: en-US; SAMIType: CC;}
    -->
    </STYLE>
</HEAD>
<BODY>
    <SYNC START=0>
        <P CLASS=SUBTTL>E: 4444444 N: 4444444 Time: 13:42:07
    <SYNC START=10>
        <P CLASS=SUBTTL>E: 44444444 N: 3333330 Time: 13:42:08
    <SYNC START=1010>
        <P CLASS=SUBTTL>E: 33333333 N: 4444444 Time: 13:42:09
    <SYNC START=2010>
        <P CLASS=SUBTTL>E: 2222222 N: 3333333 Time: 13:42:10
</BODY>
</SAMI>

谢谢,凯文

【问题讨论】:

  • 目前,我正在考虑进行正则表达式搜索。不确定这是否是最好的方法。这是一种奇怪的语法组合,有点像粗俗的 HTML。编辑-如果我要删除“”符号之间的所有内容怎么办。我可能会留下一个以空格分隔的文件?
  • 据我了解,它不是有效的 XML 文件?
  • 不,虽然它确实有适当的起始元素。我也许能够以某种方式导航树并拉出

    元素的所有内部文本。

  • 当我使用 XMLTextReader 解析时,我得到了这个异常:“System.Xml.XmlException: '0' is an unexpected token。”在第 11 行第 14 行。

标签: c# .net winforms parsing text


【解决方案1】:

在 .NET 正则表达式中使用以下模式

@"^(?:\s+<P CLASS=SUBTTL>E:)\s+(\d+)\s+N:\s+(\d+)\s+Time:\s+(\d\d:\d\d:\d\d)" 

坐标和时间将在 Group[1], [2], [3] 中

我对此进行了测试。

        Regex r = new Regex(pat, RegexOptions.IgnoreCase);

        // Match the regular expression pattern against a text string.
        Match m = r.Match(input);
        if (m != null)
        {
            Debug.WriteLine(m.Groups[1].Value);
            Debug.WriteLine(m.Groups[2].Value);
            Debug.WriteLine(m.Groups[3].Value);
        }

【讨论】:

  • 谢谢你,布拉姆!我的正则表达式几乎分 3 步运行,但它并没有那么简洁和雄辩。
  • 如果你得到一个个位数的小时,你可以使用\d?\d。单步的好处是输出是模式匹配的一部分。 ?: 使其成为非捕获组,因此它不会用完 Group[1]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2022-01-21
  • 2012-05-16
相关资源
最近更新 更多