प्रसंस्करण करना मेरे दूसरे दिन एक दिलचस्प साक्षात्कार प्रश्न था, जिसे मैंने वास्तव में संघर्ष किया था। (अत्यधिक महत्वाकांक्षी) spec मुझे लिखने के लिए आवश्यक है, सी # में, दो अलग-अलग डेटा धाराओं के लिए पार्सर्स। यहाँ पहली धारा की एक बना हुआ उदाहरण है:डेटा फीड प्रारूप
30=EUR/USD,35=3,50=ON,51=12.5,52=13.5,50=6M,51=15.4,52=16.2,50=1Y,51=17.2,52=18.3
जहां 30 मुद्रा जोड़ी है, 35 tenors की संख्या है, और 50,51,52 तत्त्व, बोली रहे हैं और क्रमश: पूछो। बोली और पूछना वैकल्पिक है, लेकिन एक सही अवधि-बोली-पूछने वाले टुपल में कम से कम दो कीमतों में से एक होगा। उनके द्वारा प्रदान किए गए ढांचे कोड से संकेत मिलता है कि इस लाइन को पार्स करने का नतीजा 3 अलग-अलग ऑब्जेक्ट्स (डेटाइलेमेंट इंस्टेंस) होना चाहिए। मैं एक बदसूरत स्विच-कथन और लूप-आधारित कार्यान्वयन के साथ समाप्त हुआ जो मुझे यकीन नहीं है कि वास्तव में काम किया है।
इस तरह की धारा पढ़ने के लिए क्या तकनीकें हैं? मैंने रिकर्सन के साथ कुछ पता लगाने की कोशिश की, जिसे मैं सही नहीं मिला।
संपादित करें: @ evanmcdonnall के उत्तर (स्वीकृत) के आधार पर यहां पूरी तरह से संकलित और काम करने वाला कोड है, यदि यह किसी और के लिए उपयोगी है।
List<DataElement> Parse(string row)
{
string currency=string.Empty;
DataElement[] elements = null;
int j = 0;
bool start = false;
string[] tokens = row.Split(',');
for (int i = 0; i < tokens.Length; i++)
{
string[] kv = tokens[i].Split('=');
switch (kv[0])
{
case "30":
currency = kv[1];
break;
case "35":
elements = new DataElement[int.Parse(kv[1])];
break;
case "50":
if (start)
j++;
elements[j] = new DataElement() { currency = currency, tenor = kv[1] };
start = true;
break;
case "51":
elements[j].bid = double.Parse(kv[1]);
break;
case "52":
elements[j].ask = double.Parse(kv[1]);
break;
}
}
return elements.ToList();
}
मुख्य अवधारणाओं हैं:
- प्रत्येक पंक्ति में आइटम दोहराने की "आंतरिक लूप"
- इंगित करने के लिए एक बूलियन ध्वज है के लिए एक अलग काउंटर है जब कि "आंतरिक पाश" शुरू होता है
- "आंतरिक लूप" परिणामों को उस बिंदु पर संग्रहीत करने के लिए ऑब्जेक्ट्स की सरणी आवंटित करें जहां लंबाई ज्ञात है (यानी, टैग 50)
- सादगी और स्पष्टता के लिए, एक ऐसा फ़ंक्शन है जो केवल एक ही पढ़ता है लाइन, फिर इसे एक अलग समारोह से कई बार कॉल करें।
यह इस तरह नहीं दिखता है एक सीमांकित datastream, और न ही निश्चित चौड़ाई है। मुझे लगता है कि आपकी विधि उचित लगती है –
तत्वों का क्रम हमेशा समान होता है? मेरा मतलब है कि पहले आपके पास मुद्रा जोड़ी होगी, फिर किरायेदारों की संख्या होगी, और उसके बाद किरायेदारों की संख्या के अनुरूप टुपल की सही संख्या होगी? – ppetrov
@AndrewWalters: यह काफी लगातार '' '' – mellamokb