2017-07-31 65 views
0

嗨,我有一個字符串結果,如下所示。從字符串中提取和打印數據

String result= 
>TxData: 7C,0,7A,10,0,0,4,0,0,0,7B,50,0,0,0,0,0,0,0,0,0,0,0,0\r\n\t 
>RxData: 4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,7C,0,*7A*,2D,80,0,*7B*,0,4A,4A,4A,4A\r\n" 

我只是想檢查如果字符串包含RXDATA。遍歷該行直到找到7A和7B。我想要獲取這兩個字符之間的數據。 我寫了一段代碼,但是它搜索TXdata行的數據。 我知道如何獲取7A和7B之間的數據。 如何遍歷rxdata行而不是tx數據行。

我用方法的索引來得到7a和7b的索引。有了這我提取他們之間的數據。 此代碼遍歷tx數據行。我只想要rx數據線。

if (result.Contains("RxData: ")) 
{ 
    foreach (byte word in result) 
    { 
     index1 = result.IndexOf("7A"); 
     index2 = result.IndexOf("7B"); 
    } 
} 
+0

這是一個有點混亂,那'result'是'string'但在你的'foreach'的itteration eleme nt是一個'byte'?=! –

+0

「有了這個我提取他們之間的數據。」我沒有看到任何解壓縮代碼。你打算如何處理提取的數據? –

+0

你想得到'7A'和'7B'嗎? –

回答

3

我如何遍歷僅RXDATA線,而不是TX數據線。

開始在那裏RxData寫入和使用String.SubString方法拉字符串的其餘部分字符串中的點。

String result = 
    "> TxData: 7C,0,7A,10,0,0,4,0,0,0,7B,50,0,0,0,0,0,0,0,0,0,0,0,0\r\n\t"+ 
    " > RxData: 4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,7C,0,*7A *,2D,80,0,*7B *,0,4A,4A,4A,4A\r\n"; 

if (result.Contains("RxData")) 
{ 
    int start = result.IndexOf("RxData"); 
    string rxDataString = result.Substring(start, result.Length - start); 
} 

我想這2個字符之間的數據。

您可以找到2個指數和再次使用String.SubString方法拉出串其間任何內部消除環路:

start = rxDataString.IndexOf("7A");  
int end = rxDataString.IndexOf("7B"); 

string dataInBetween = rxDataString.Substring(start, end-start); 

編輯

這個循環將永遠不會編譯! :

通過 string迭代時
foreach (byte word in result) 
{ 
    index1 = result.IndexOf("7A"); 
    index2 = result.IndexOf("7B"); 
} 

,每個元素都是一個char!不是byte
此循環也沒有多大意義,因爲IndexOf將遍歷整個字符串以查找索引。在你的情況下,你會尋找索引n次!運行時間爲O(n²)

你應該得到索引一次,拉出aut子串,然後可以使用Split(' ')獲取元素到一個數組(取決於你的目標)。那麼迭代它們就有意義了。

+0

yea..this工作..感謝很多 – dipk11

+0

@ dipk11沒問題,很高興我能幫上忙。 –

1

您應該拆分字符串。如果該行最終總是相同的,你可以使用

var lines = result.Split(\r\n\t); 

你也可以檢查是否狹縫中包含「RXDATA:」

for(i = 0; i < lines.length; i++) 
{ 
    if (lines[i].Contains("RxData: ")) 
     { 
      foreach (byte word in result[1]) 
      { 
       index1[i] = lines[i].IndexOf("7A"); 
       index2[i] = lines[i].IndexOf("7B"); 
      } 
     } 
} 
+1

甚至不會編譯。 – HimBromBeere

1

你可以在新的線分割你的串並重復返回數組:

var lines = result.Split("\r\n\t"); 
var rxData = lines.FirstOrDefault(x => c.Contains("RxData")); 
if(rcData != null) 
{ 
    ... 
} 
0

那沒有indexOfs的單線程怎麼樣?它7A之間獲得字符和7B

String result = 
    @"> TxData: 7C,0,7A,10,0,0,4,0,0,0,7B,50,0,0,0,0,0,0,0,0,0,0,0,0\r\n\t 
     > RxData: 4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,4A,7C,0,*7A *,2D,80,0,*7B *,0,4A,4A,4A,4A\r\n"; 

string firstLimiter = "7A"; 
string secondLimiter = "7B"; 

var answer = string.Join("", 
    Regex.Match(
     Regex.Match(result, ".+RxData.+" + firstLimiter + ".+" + secondLimiter + ".+").Value, 
     firstLimiter + ".+" + secondLimiter) 
    .Value 
    .Skip(2) 
    .Reverse() 
    .Skip(2) 
    .Reverse() 
); 

如果answer被逆轉,那麼請在結束時再次反轉。 您可以將RxData替換爲TxData並突然看起來在第一行

+0

哇,不使用混淆器而對代碼進行混淆。老實說,即使*如果*工作/我沒有測試)它似乎相當複雜的恕我直言。 – HimBromBeere

+0

你的評論也不清楚。請告訴我哪個部分很複雜? – user7234965

+0

@HimBromBeere我在'indexOf'函數中使用了另一種方式,因爲有時候更容易編寫一行代碼,而不是像List一樣每次存儲值都像'List'一樣具有O(n)搜索功能。所以我不認爲我做了一些複雜的事情。 – user7234965

1

要獲取這兩個值之間的數據(子字符串),您可以使用許多不同的方法。

正如其他答案顯示,您可以使用IndexOf
IndexOf有一個重載,需要看起始索引。所以,如果你有RxData指數,你可以用它作爲indexOf

起始位置,選項1:

int rxIdx = result.IndexOf("RxData"); 
int idx_7A = result.IndexOf("7A", rxIdx); 
int idx_7B = result.IndexOf("7B", rxIdx); 
string myData = result.Substring(idx_7A, idx_7B - idx_7A + 2); // Including 7A and 7B 
string myData = result.Substring(idx_7A + 3, idx_7B - idx_7A - 4); // Excluding 7A and 7B 

選項2使用一個簡單的正則表達式與捕獲組:

string myData2 = Regex.Match(result, "(?<=RxData).*(?<RESULT>7A.*7B)") 
         .Groups["RESULT"] 
         .Value; // Including 7A and 7B 

string myData2 = Regex.Match(result, "(?<=RxData).*7A,(?<RESULT>.*),7B") 
         .Groups["RESULT"] 
         .Value; // Excluding 7A and 7B 

你可以看到它在這裏工作:https://regex101.com/r/QIrmBn/2