可靠地解析字符串

时间:2018-03-23 16:00:24

标签: c# string

我正在尝试解析一串数据,以便将它们存储到数据库中。 数据样本如下所示:

  

完成@ Store @ 000019411:02:48.499 1 0C 138D71802103D @ 000080211:03:16.530 1 0F 138D81802102B @ 000088211:04:10.546 1 0D 138D918021034 @ 000023011:04:45.809 1 0F 138DA1802103B @ 000019411:04:47.202 1 08 238DB1802102D @ 000025111:05:51.550 1 0F 138DC18021037 @ 000088111:05:53.429 1 0F 138DD18021048 @ 11 @ $

我试图将其转换为:

  

000019411:02:48.499 1 0C
  000080211:03:16.530 1 0F

我也在@符号之前跳过信息。在字符串数据的最末端只有一个新行,回车符。 所有字符串都以@ Store @开头,以@ $结尾 记录的数量可能会有很大差异,但这可能是一个问题。 我正在努力研究如何以可靠的方式取出记录,因为我的结果好坏参与。

if (data.Contains("Store@") == true)
                {
                    y = data.IndexOf("@Store@");
                   while (x<=data.Length) {
                        Console.WriteLine(x);

                        string substr = data.Substring(x,y);
                      string substr = data.Substring(y + 7, y + 18);
                        Console.WriteLine("Data: {0}", substr);
                       y = substr.Length+21;
                       x = y + 21;
                       substr = "";

}

第一次使用断点在调试模式下运行代码时,我得到以下输出:

  

数据:000019411:02:48.499 1 0C
   66个
   数据:@ 000080211:03:16.530 1 0F   138D81802102B @ 000088211:04:10.546 1
  105

我不确定最新情况,66和105是当前的字符串长度。

我对此代码的另一个问题是,当我运行它时,我收到一个调试错误:

  

发生了System.ArgumentOutOfRangeException     的HResult = 0x80131502     消息=索引和长度必须引用字符串中的位置。   参数名称:长度

当我设置断点时,程序运行正常,发送数据的应用程序并不总是发送数据,我必须告诉它,不幸的是我无法更改数据的格式。 为长期查询道歉。 谢谢你们

1 个答案:

答案 0 :(得分:0)

史蒂夫用他的评论打败了我,但假设记录的大小不变:

const int recsize = 38;
const int outputsize = 24;
string data = "Finish@Store@000019411:02:48.499 1 0C 138D71802103D@000080211:03:16.530 1 0F 138D81802102B@000088211:04:10.546 1 0D 138D918021034@000023011:04:45.809 1 0F 138DA1802103B@000019411:04:47.202 1 08 238DB1802102D@000025111:05:51.550 1 0F 138DC18021037@000088111:05:53.429 1 0F 138DD18021048@11@$";
foreach(string s in data.Split("@"))
{
    if(s.Length == recsize)
        Console.WriteLine(s.Substring(0, outputsize));
}
Console.ReadKey();

输出:

000019411:02:48.499 1 0C
000080211:03:16.530 1 0F
000088211:04:10.546 1 0D
000023011:04:45.809 1 0F
000019411:04:47.202 1 08
000025111:05:51.550 1 0F
000088111:05:53.429 1 0F