2017-07-11 9 views
0

Ich habe Protokolldaten von 1000 bis 100000 Einträge alle aus verschiedenen Quellen. Ziel ist es, diese Daten nach Zeit (schnell) zu sortieren. Ich war Prototyping in C und ich bin fest, weil es aussieht wie tm nicht Millisekunden unterstützt. Fehle ich hier etwas? Irgendwelche Vorschläge ?time.h - Struktur tm und Millisekunden

Idee:

  1. Datei öffnen. Parsen zeilenweise und tokenisieren Felder in c struct über strtok

    1.1 Konvertieren Datum & Zeit zu "struct tm".

    1.2 Build verkettete Liste

  2. Sortieren verkettete Liste basierend auf Zeit (nicht wissen, welche Art Algorithmus ich verwenden würde)
  3. Ausgang

[Beispiel]

YYYY-MM-DD,HH:MM:SS:MS , PID, TID , COMPONENT, Message 
2017-03-29,20:56:27:088, 3436,2568,COMPONENT, Message String blah blah 
2017-03-29,20:56:27:089, 3436,2568,COMPONENT, Message String baaaaa 
2017-03-29,20:56:27:079, 3436,2568,COMPONENT, Message String roarrr 
2017-03-29,20:56:28:061, 3436,2568,COMPONENT, Message String meow 
2017-03-29,20:56:25:044, 3436,2568,COMPONENT, Message String ruff ruff 
. 
. 
. 
100000 entries 

const char T[] = "2017-03-29,20:56:27:088"; //Test String 
time_t result = 0; 
int year = 0, month = 0, day = 0; 
int hour = 0, min = 0, sec = 0, ms = 0; 

if (sscanf(T, "%4d-%2d-%2d,%2d:%2d:%2d", &year, &month, &day, &hour, &min, &sec) == 6) { 
    struct tm tv = {0}; 
    tv.tm_year = year; 
    tv.tm_mon = month; 
    tv.tm_mday = day; 
    tv.tm_hour = hour; 
    tv.tm_min = min; 
    tv.tm_sec = sec; 
    //Crap, it doesn't look like tm handles milliseconds ???? 

    if ((result = mktime(&tv)) == (time_t)-1) { 
     fprintf(stderr, "Conversion Error\n"); 
    } 
    puts(ctime(&result)); 
} 
else { 
    fprintf(stderr, "Invalid Format\n"); 
} 
+3

C++ hat eine [chrono's high_resolution_clock] (http://en.cppreference.com/w/cpp/chrono/high_resolution_clock), deren Dauer Sie Millisekunden so einfach wie _ _ "A, B, C, 1, 2 , 3"_. Denken Sie darüber nach, das 'C++' - Tag aus Ihrer C-Frage zu entfernen. Sie sind zwei verschiedene Sprachen. – Ron

+5

Verwenden Sie C oder C++? Sie sind verschiedene Sprachen. – NathanOliver

+0

Überprüfen Sie Repo: https://github.com/izaak-coleman/chronoBench. Wenn Sie C++ verwenden können, können Sie dies verwenden. –

Antwort

1

Sie können das Ergebnis von mktime zurücknehmen und in Millisekunden umwandeln.

if ((result = mktime(&tv)) == (time_t)-1) { 
    fprintf(stderr, "Conversion Error\n"); 
} 
long long resultmilli = (result * 1000LL) + ms; 
4

Ich verstehe nicht, warum Sie diese Zeitstempel in eine struct tm, oder in jede andere Darstellung zu konvertieren. Sie werden bereits lexikografisch genau so sortieren, wie Sie es möchten, in ihrer aktuellen String-Form. Also tu das einfach.

+0

Danke ... ich werde diesen Ansatz versuchen. – Matt