Лучший метод для токенизации / извлечения информации из строки - PullRequest
1 голос
/ 21 января 2011

Я пытаюсь преобразовать полученное время и дату в определенный формат для вставки в базу данных 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 ]

1 голос
/ 21 января 2011

Используйте boost :: date_time . Вы можете форматировать ввод и вывод различными способами с помощью строки форматирования.

1 голос
/ 21 января 2011

Вы анализируете строку и, к счастью, вы можете построить вывод простым добавлением. Я не вижу, что это становится более эффективным.

Однако, похоже, что вы можете использовать seekg для позиционирования курсора за прошедшим днем ​​недели и настройки UTM.

http://www.cplusplus.com/reference/iostream/istream/seekg/

0 голосов
/ 21 января 2011

Если вы работаете в системе POSIX (т.е. не в Windows), вы можете использовать strptime: http://www.mkssoftware.com/docs/man3/strptime.3.asp

Это берет строку и создает struct tm, который вы можете вывести в любом желаемом формате через strftime.

Существует несколько реализаций Windows, но по умолчанию она недоступна. Подробнее здесь: Преобразование строки в дату в C ++

...