Лучший метод для токенизации / извлечения информации из строки
Я пытаюсь преобразовать дату-время, которое я получаю, в определенный формат для вставки в базу данных MySQL. Программа написана на C++, и следующее решение работает, но я чувствую, что оно ужасно неэффективно.
Ввод: Пн Ноя 08 17:41:23 +0000 2010
Желаемый формат вывода: ГГГГ-ММ-ДД ЧЧ: ММ: СС
Таким образом, для этого примера вывод будет: 2010-11-08 17:41:23
Я включил соответствующие части кода.
//class variable
std::map<std::string, std::string> monthMap;
void processor::initializeMonthMap(){
monthMap["Jan"] = "01";
monthMap["Feb"] = "02";
monthMap["Mar"] = "03";
monthMap["Apr"] = "04";
monthMap["May"] = "05";
monthMap["Jun"] = "06";
monthMap["June"] = "06";
monthMap["Jul"] = "07";
monthMap["July"] = "07";
monthMap["Aug"] = "08";
monthMap["Sept"] = "09";
monthMap["Sep"] = "09";
monthMap["Oct"] = "10";
monthMap["Nov"] = "11";
monthMap["Dec"] = "12";
}
inline std::string processor::convertDate(std::string input) {
//Format: Mon Nov 08 17:41:23 +0000 2010
//To get to YYYY-MM-DD HH:MM:SS
std::stringstream newString(input);
std::string temp1;
std::string temp2;
// Read Day in txt, discard
newString >> temp1;
//Read month, convert to number
newString >> temp1;
temp2 = "-" + monthMap[temp1] + "-";
//Read Day in number
newString >> temp1;
temp2.append(temp1 + " ");
//Read TimeStamp
newString >> temp1;
temp2.append(temp1);
//Discard UTM adjustment
newString >> temp1;
//Read year
newString >> temp1;
//Add year to beginning of input
temp1.append(temp2);
return temp1;
}
3 ответа
Вы анализируете строку и, к счастью, вы можете построить вывод простым добавлением. Я не вижу, что это становится более эффективным.
Однако, похоже, что вы можете использовать seekg для позиционирования курсора за прошедшим днем недели и настройки UTM.
Используйте boost:: date_time. Вы можете форматировать ваш ввод и вывод различными способами с помощью строки форматирования.
Если вы работаете в системе POSIX (т.е. не в Windows), вы можете использовать strptime: http://www.mkssoftware.com/docs/man3/strptime.3.asp
Это берет строку и строит struct tm
, который вы можете вывести в любом желаемом формате через strftime.
Существует несколько реализаций Windows, но по умолчанию она недоступна. Подробнее здесь: Преобразование строки в дату в C++