2011-01-20 4 views
1

MySQL 데이터베이스에 삽입 할 특정 형식으로 수신하는 날짜 - 시간을 변환하려고합니다. 이 프로그램은 C++로 작성되었으며 다음과 같은 솔루션이 작동하지만 엄청나게 비효율적이라고 생각합니다.문자열에서 정보를 토큰 화/추출하는 가장 좋은 방법

입력은 다음과 같습니다 월 11월 8일 17시 41분 23초 0000 2010
원하는 출력 형식은 다음과 같습니다 YYYY-MM-DD HH : MM : SS
그래서이 예제의 출력은 다음과 같습니다 2010- 11-08 17:41:23

본인은 관련 코드 부분을 포함 시켰습니다. 당신이 POSIX 시스템 (즉,하지 창)에있는 경우

//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; 
} 
+0

당신은 정규식 (표준 : TR1 또는 부스트 : 정규식)를 사용하여 깨끗한 솔루션을 수 있습니다. 또한 형식이 표준 인 경우 Boost.Date_Time을 조사 할 수 있습니다. – anno

+2

컴파일러 최적화 코드 실행을 측정 해 보셨습니까? 귀하의 코드는 매우 직관적입니다. 당신은 더 짜낼 수 있지만, 그만한 가치가 있습니까? 당신처럼 깨끗하고, 이해할 수 있고, 합리적으로 효율적인 코드는 가치가 있습니다. (방금 tempXXX의 이름을 적절한 이름으로 변경 한 경우 ...) –

+0

일반적으로 @Peter에 동의합니다. 그러나이 경우, 날짜/시간 라이브러리를 사용하면이 코드를'get_date_from_string (..., format)'다음에'get_string_from_date (..., other_format)'라는 두 줄로 줄일 수 있습니다. 이것은 더 명확하고 간명 할 것입니다. – Tim

답변

1

문자열을 구문 분석하면 다행히도 간단한 추가로 출력을 빌드 할 수 있습니다. 나는 이것이 점점 더 효율적으로 보이지 않는다.

그러나 seekg를 사용하여 커서를 요일과 UTM 조정 이후에 배치 할 수있는 것처럼 보입니다.

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

+0

언급 된 다른 방법은 코드를 줄일 수 있지만 IMO 효율성을 해결하지는 못합니다. –

+0

정보를 제공해 주셔서 감사합니다. 나는 stringstream에 대한 질문이 있습니다. 매번 stringstream을 작성하는 대신 string.find()를 사용하면 더 잘할 것이라고 생각하십니까? –

+1

다양한 부분의 길이가 항상 동일하다는 것을 알고있는 경우 나타납니다. stringstream을 버리고 싶다면, std :: string :: substr (start, count)을 사용할 것이다. –

1

boost::date_time을 사용하십시오. 형식 문자열을 사용하여 다양한 방식으로 입/출력을 형식화 할 수 있습니다.

관련 문제