格式化非结构化字符串

时间:2015-10-08 20:17:44

标签: c# regex parsing

我尝试了几种方法(按位置,按空格,正则表达式),但无法计算如何最好地将以下行解析为表格。对于例如让我们说我要解析的两行是:

Bonds               Bid   Offer  (mm)   (mm) Chng
STACR 2015-HQA1 M1  125    120    5   x 1.5   0
STACR 2015-HQA12 2M2  265  5   x       -2

我希望它能解析[BondName] [Bid] [Offer]:

[STACR 2015-HQA1 M1] [125] [120]

[STACR 2015-HQA12 2M2] [265] [null]

注意null是一个实际值,空格也应保留在键名中。仅供参考,债券名称中的空格数量将为2,如上例所示。

编辑:由于你们很多人在这里要求代码,所以。点之间的空格可以是1-5,所以我不能回答空格(那时很简单)。

string bondName = quoteLine.Substring(0, 19);
string bid = quoteLine.Substring(19, 5).Trim();
string offer = quoteLine.Substring(24, 6).Trim();

我能看到这个工作的唯一方法是:

  • 第一个数据点是STACR(类型)
  • 第二个数据点是年份和系列 (例如2015-HQA1)
  • 第3个数据点是Tranche(M1)
  • 第四个数据点是出价 (例如125 **出价始终可用**)
  • 提供第5个数据点(例如120 ,但可以为空白 或引入复杂性的空白

1 个答案:

答案 0 :(得分:0)

[编辑] 我没有说明空白的提议'因此,此方法将在空白的“优惠”中失败。看起来某人已经有了一个可行的答案,但我会留下linq示例给任何发现它有用的人。 [结束编辑]

基于Linq的选项。

按空格分割字符串,并删除空格。然后颠倒顺序,这样你就可以从后面开始并继续前进。数据在字符串末尾显示更加标准化。

对于该行的每个连续部分,您跳过以前的选项并仅采取您需要的内容。对于最后一部分是长字符串,您跳过了您不需要的内容,然后将顺序反转回正常状态,并将这些部分与空格连接起来。

        string test = "STACR 2015-HQA1 M1  125    120    5   x 1.5   0";

        var split_string_remove_empty = test.Split(new char[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries).Reverse();

        var change = split_string_remove_empty.Take(1)
                                              .SingleOrDefault();
        var mm2 = split_string_remove_empty.Skip(1)
                                           .Take(1)
                                           .SingleOrDefault();
        var mm3 = split_string_remove_empty.Skip(3)
                                           .Take(1)
                                           .SingleOrDefault();
        var offer = split_string_remove_empty.Skip(4)
                                             .Take(1)
                                             .SingleOrDefault();
        var bid = split_string_remove_empty.Skip(5)
                                           .Take(1)
                                           .SingleOrDefault();
        var bonds = string.Join(" ", split_string_remove_empty.Skip(6)
                                                              .Reverse());

输出: Output data for above code