Это старый поток, но он все еще находится в верхней части результатов поиска, поэтому я добавляю свое решение, используя std :: stringstream и простой метод замены строки Yves Baumes, который я нашел здесь.
Следующий пример будет читать файл по строкам, игнорировать строки комментариев, начинающиеся с //, и анализировать другие строки в комбинации строк, ints и double. Stringstream выполняет разбор, но ожидает, что поля будут разделены пробелами, поэтому я использую stringreplace, чтобы сначала включить запятые в пространства.
Плохой или отсутствующий ввод просто игнорируется, что может быть или не быть хорошим, в зависимости от ваших обстоятельств.
#include <string>
#include <sstream>
#include <fstream>
void StringReplace(std::string& str, const std::string& oldStr, const std::string& newStr)
// code by Yves Baumes
// http://stackoverflow.com/questions/1494399/how-do-i-search-find-and-replace-in-a-standard-string
{
size_t pos = 0;
while((pos = str.find(oldStr, pos)) != std::string::npos)
{
str.replace(pos, oldStr.length(), newStr);
pos += newStr.length();
}
}
void LoadCSV(std::string &filename) {
std::ifstream stream(filename);
std::string in_line;
std::string Field;
std::string Chan;
int ChanType;
double Scale;
int Import;
while (std::getline(stream, in_line)) {
StringReplace(in_line, ",", " ");
std::stringstream line(in_line);
line >> Field >> Chan >> ChanType >> Scale >> Import;
if (Field.substr(0,2)!="//") {
// do your stuff
// this is CBuilder code for demonstration, sorry
ShowMessage((String)Field.c_str() + "\n" + Chan.c_str() + "\n" + IntToStr(ChanType) + "\n" +FloatToStr(Scale) + "\n" +IntToStr(Import));
}
}
}
К сожалению, вы не можете десериализовать весь конверт из-за проблемы с отложенной десериализацией: https://github.com/Microsoft/bond/issues/96 .
. Так что вам нужно как-то еще разобрать baseData
и затем передать его десериализатору связей. Или, возможно, просто проанализируйте его как JSON с использованием некоторых JSON-анализаторов, как мы это делали в модульных тестах .
JsonReader reader = new JsonTextReader(new StringReader(Encoding.UTF8.GetString(b, 0, b.Length)));
reader.DateParseHandling = DateParseHandling.None;
JObject obj = JObject.Load(reader);
return obj.ToObject<AI.TelemetryItem<TelemetryDataType>>();
Я не могу комментировать наиболее эффективный способ сделать это, поскольку я не уверен, в чем заключается ваша задача. В некоторых случаях наиболее эффективный способ - вообще не десериализовать всю полезную нагрузку.