Tôi đã có một câu hỏi phỏng vấn thú vị vào một ngày khác mà tôi thực sự gặp khó khăn. Đặc tả (tham vọng cao) yêu cầu tôi viết, trong C#, trình phân tích cú pháp cho hai luồng dữ liệu khác nhau. Dưới đây là ví dụ được tạo sẵn của luồng đầu tiên:Xử lý định dạng nguồn cấp dữ liệu
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
trong đó 30 là cặp tiền tệ, 35 là số lượng kỳ hạn và 50,51,52 là kỳ hạn, giá thầu và yêu cầu tương ứng. Giá thầu và yêu cầu là tùy chọn, nhưng một giá thầu tenor-bid-ask chính xác sẽ có ít nhất một trong hai giá. Mã khung mà họ cung cấp ngụ ý rằng kết quả phân tích cú pháp dòng này phải là 3 đối tượng riêng lẻ (các cá thể DataElement). Tôi đã kết thúc với một tuyên bố chuyển đổi khá khó chịu và thực hiện dựa trên vòng lặp mà tôi không chắc chắn thực sự làm việc.
Có những kỹ thuật nào để đọc loại luồng này? Tôi cố gắng tìm ra điều gì đó với đệ quy, điều mà tôi không thể làm đúng.
EDIT: Dựa trên câu trả lời của @ evanmcdonnall (được chấp nhận) ở đây là mã biên dịch và làm việc đầy đủ, trong trường hợp nó hữu ích cho bất kỳ ai khác.
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();
}
Các khái niệm chính là:
- Có một quầy riêng cho "vòng trong" lặp lại các mục trong mỗi dòng
- Có một lá cờ boolean để cho biết khi đó "vòng trong" bắt đầu
- Phân bổ mảng đối tượng để lưu trữ kết quả "vòng lặp bên trong" tại điểm mà độ dài được biết (nghĩa là, thẻ 50)
- Để đơn giản và rõ ràng, có chức năng chỉ đọc một lần , sau đó gọi nó nhiều lần từ một hàm riêng biệt.
Nó không giống như thế này là một luồng dữ liệu xác định, cũng không chiều rộng cố định. Tôi nghĩ phương pháp của bạn có vẻ hợp lý –
là thứ tự của các phần tử luôn giống nhau? Ý tôi là trước tiên bạn sẽ có cặp tiền tệ, sau đó là số lượng kỳ hạn, và sau đó số lượng chính xác các bộ dữ liệu tương ứng với số lượng kỳ hạn? – ppetrov
@AndrewWalters: Có vẻ như được phân cách khá nhất quán với ',' ... – mellamokb