2013-01-16 69 views
1

ADIF是HAM運營商無線電記錄的標準。有問題的ADIF記錄

<EOR> 

指示記錄的結束。我將一個ADIF文件分成多個記錄

以下記錄導致問題。

<CALL:6>SV2JAO<QSO_DATE:8:D>20101001<TIME_ON:4>1736<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:62>TNX QSO, 73 FROM GREECE <pse paper qsl card for my collection> 

這裏是使用正則表達式將文件拆分爲多個記錄的代碼。

string[] x = Regex.Split(record.Replace("\n", "").Replace("\r", ""), @"<(.*?):.*?>([^<\t\n\r\f\v]+)").Where(S => !string.IsNullOrEmpty(S)).ToArray(); 

var dic = new Dictionary<string, string>(); 
for (int i = 0; i < x.Length; i++) 
{ 
    dic.Add(x[i].ToLower(), x[i + 1]); 
    i++; 
} 

這是問題與<和>內ADIF細胞<TAG:lenghtOfValue>Value

下面是樣本記錄。

<CALL:6>RK3DXB<QSO_DATE:8:D>20100926<TIME_ON:4>1334<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E 

<CALL:6>EA1BRD<QSO_DATE:8:D>20100926<TIME_ON:4>1334<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E 

<CALL:6>UV5EHT<QSO_DATE:8:D>20100926<TIME_ON:4>1334<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E 

<CALL:5>G4MKI<QSO_DATE:8:D>20100926<TIME_ON:4>1536<BAND:3>30M<MODE:5>PSK31<RST_SENT:4>599 <RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:22>73, thanks for the QSO 

<CALL:6>EA1BRD<QSO_DATE:8:D>20100926<TIME_ON:4>1636<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:19>TNX For QSO TU 73!. 

<CALL:5>F5PEZ<QSO_DATE:8:D>20100926<TIME_ON:4>1705<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:29>Tnx for the QSO best 73 Andre 

<CALL:6>UA3LSX<QSO_DATE:8:D>20100926<TIME_ON:4>1749<BAND:3>30M<MODE:5>PSK31<RST_SENT:3>599<RST_RCVD:0><QSL_SENT:1>Y<QSL_SENT_VIA:1>E<QSLMSG:19>TNX For QSO TU 73!. 

如何修改我的代碼或正則表達式來解決此問題?

+0

你的代碼示例給出了一個錯誤,指出索引超出陣列中界。這發生在最後一個元素上。信息的哪一部分應該是字典中的關鍵和價值? –

+0

是的,但是如何使用正則表達式來防止(內部的ADIF單元格)? – SQ7MRU

+0

這個問題與'( inner ADIF cell)'無關。假設你的正則表達式返回2個字符串{「A」,「B」}的數組第一次迭代將一個項目添加到字典中,A作爲鍵,B作爲值。第二次迭代使用B作爲鍵向詞典中添加一個項目,並搜索數組中的第三個項目。但是該數組只包含2個字符串。這是造成這個問題的原因。你的問題沒有解釋你爲什麼這樣使用字典。 –

回答

0

解決:

  // workaround to prevent from '<something>' inner ADIF Cell 
      string[] x = Regex.Split(record.Replace("\n", "").Replace("\r", ""), @"<([^:]+):\d+[^>]*>").ToArray(); 
      List<string> l = new List<string>(x); 
      l.RemoveAt(0); 
      x = l.ToArray();