【问题标题】:How can i analise millions of strings that merge into each other?我如何分析数百万个相互合并的字符串?
【发布时间】:2017-09-11 15:38:01
【问题描述】:

我有数百万个字符串,大约 8GB 的​​ HEX;每个字符串的长度为 3.2kb。

这些字符串中的每一个都包含我需要提取的多个数据部分。

这是一个这样的字符串的示例:

GPGGA,104644.091,,,,,0,0,,,M,,M,,*43$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32 标头测试。ÿÿ。 ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ$GPGGA, 104645.091,,,,,0,0,,,M,,M,,*42$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32标头测试.ÿÿ.ÿÿ.ÿÿ.ÿÿ 。 m ,, m ,,*41 $ gpvtg,0.00,t,m,0.00,n,0.00,k,n*32header test2 headertest2ÿ ,, 0,0 ,, M ,,*40 $ gpvtg,0.00,t ,, m,0.00,n,0.00,k,k,n*32header testk teskk。 GPGGA,104648.091 ,,, 0,0,,,, M ,, M ,,*4f $ gpvtg,0.00,0.00,t ,, m,m,0.00,n,0.00,n,0.00,k,n*32header testdumtestdÿ ,104649.091,,,,,0,0,,,M,,M,,*4E$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32标头测试}ÿÿ~ÿÿ.ÿÿ€ ÿÿ.ÿÿ,ÿÿƒÿÿ„ÿÿ...ÿÿ†ÿÿ‡ÿÿˆÿÿ‰ÿÿŠÿÿ‹ÿÿŒÿÿ.ÿÿŽÿÿ.ÿÿŽÿ.ÿÿ.ÿÿ'ÿÿ'ÿÿ“ÿÿ”ÿÿ•ÿÿ$GPGGA,104650,,,091,,,,0,50.09,,,, ,M,,*46$GPVTG,0.00,T ,,M,0.00,N,0.00,K,N*32头

正如你所看到的,它几乎是重复的:

GPGGA,104644.091,,,,,0,0,,,M,,M,,*43$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32 标头测试。ÿÿ。 ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ$GPGGA, 104645.091,,,,,0,0,,,M,,M,,*42$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32标头测试.ÿÿ.ÿÿ.ÿÿ.ÿÿ 。

我想把这个字符串分成两个这样的列表:

_GPS列表

$GPGGA,104644.091,,,,,0,0,,,M,,M,,*43
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N

_WavList

32HeaderTest.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ
32HeaderTest.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ.ÿÿ ÿÿ!ÿÿ"ÿÿ#ÿÿ$ÿÿ%ÿÿ&ÿÿ'ÿÿ(ÿÿ)ÿÿ*ÿÿ+ÿÿ,ÿÿ-ÿÿ.ÿÿ/ÿÿ0ÿÿ1ÿÿ

问题 1: 此重复不包含在单个字符串中,它会溢出到下一个字符串中。因此,如果某些数据跨越两个字符串的结尾和开头,我该如何处理?

问题 2:如何分析字符串并仅提取我需要的部分?

【问题讨论】:

  • 无论您从何处获取此数据,似乎都认为应该将一堆二进制数据解码为 Windows-1252 字符。如果那里有任何控制字符,这将给您带来困难。如果可能,请返回源并要求他们正确以实际十六进制字符串的形式传递数据。或者,您可能是因为将文件视为文本而出错的人——实际上并非如此,而是经常包含可打印的文本。
  • 8GB 外星语言,但肯定不是纯十六进制!
  • 它是 GPS 和原始 WAV 数据的混合体。这是我制作的数据。我有实际的 HEX,但我认为人们可能更容易看到我需要的 ASCII 表示形式
  • 你试过在“$”上分割字符串
  • 我没有,但只是因为那不会给我想要的东西。如果我这样做,我会将 GPS 和 WAV 数据混合在一起。谢谢:)

标签: c# string list


【解决方案1】:

我提供的解决方案不是一个完整的答案,而更像是一个可以帮助您获得所需内容的想法。

我提出的其他一切都是代表我的假设。

//Assuming your data is stored in a file "yourdatafile"
//Splitting all the text on "$" assuming this will separate GPSData
string[] splittedstring = File.ReadAllText("yourdatafile").Split('$');
//I found an extra string lingering in the sample you provided
//because I splitted on "$", so you gotta take that into account

var GPSList = new List<string>();
var WAVList = new List<string>();

foreach (var str in splittedstring)
{
    //So if the string contains "Header" we would want to separate it from GPS data
    if (str.Contains("Header"))
    {
       string temp = str.Remove(str.IndexOf("Header"));
       int indexOfAsterisk = temp.LastIndexOf("*");
       string stringBeforeAsterisk = str.Substring(0, indexOfAsterisk + 1);
       string stringAfterAsterisk = str.Replace(stringBeforeAsterisk, "");
       WAVList.Add(stringAfterAsterisk);
       GPSList.Add("$" + stringBeforeAsterisk);
    }
    else
       GPSList.Add("$" + str);
}

这提供了您需要的准确输出,唯一的例外是那个额外的字符串。此外,一些非标准字符可能看起来像黑块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2018-06-11
    • 2019-09-12
    • 2017-03-10
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多