Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπον, τα data που θελω ειναι μια ημερομηνια, ή ωρα ή και τα δυο. Εκτος απο δαυτη, θελω και 4 float και ενα long ή int ή float whateva. 

Σε γενικες γραμμες ειναι στανταρακι.

παραδειγμα data 

Trade Date;High;Low;Open;Close;Volume;Prev. Close;Total Turnover;Num. Of Trans.;
8/12/2008;20,560;19,600;19,980;20,460;652899;19,260;13280090,900;1037
9/12/2008;20,980;20,300;20,460;20,980;760641;20,460;15763607,360;1200
10/12/2008;21,500;20,700;21,280;21,200;1041187;20,980;22106307,220;1386

αλλο παραδειγμα

Time;Open;High;Low;Close;Volume;
17:16:00;1,500;1,500;1,500;1,500;4100
17:14:00;1,500;1,500;1,500;1,500;1500
17:13:00;1,500;1,500;1,500;1,500;4000

και αλλο παραδειγμα

Date,Open,High,Low,Close,Volume,Adj Close
2013-12-05,38.24,39.31,38.05,38.87,27650300,38.87
2013-12-04,36.47,38.15,36.25,38.13,26127800,38.13
2013-12-03,36.77,37.07,36.34,36.56,14061800,36.56
2013-12-02,37.04,37.15,36.68,37.01,11471700,37.01
2013-11-29,36.91,37.35,36.90,36.98,6455400,36.98
2013-11-27,36.70,37.12,36.51,36.96,10413200,36.96

και αλλα πολλα και διαφορα. Με διαφορα locals και formats

 

Αλλα οπως ειπα, σε γενικες γραμμες ειναι τα ιδια data. Date open, close, high, low, volume

 

Αυτο που εχω κανει τωρα ειναι τουτο

post-216584-0-62103900-1386353752_thumb.png

 

Εχω 3 πεδια.

1) το src πχ http://ichart.finance.yahoo.com/table.csv?s=YHOO&d=11&e=6&f=2013&g=d&a=3&b=12&c=1996&ignore=.csv

2) το regex 

3) ενα map για τα groups.

 

Η ιδεα ειναι απλη, φτιαχνω ενα απλο regex με τα groupακια του, και επειτα mapαρω τα groupακια. πχ στο screen shot το d λεει οτι το πρωτο group ειναι day, το M λεει οτι το δευτερο groupακι ειναι month κλπ κλπ

 

Βεβαια αυτο δεν μου γεμιζει το ματι, για αυτο οποια ιδεα ευπροσδεκτη.

Δημοσ.

Δεν έχω πολυ-καταλάβει, αλλά αν η σειρά των στηλών είναι πάντα η ίδια, π.χ. αν στο αρχείο που δίνεις ως παράδειγμα η σειρά των στηλών είναι πάντα η...

Date,Open,High,Low,Close,Volume,Adj Close
κι αν είναι να λείπει κάτι θα λείπει μόνο από τα δεξιά, τότε θα μπορούσες υποθέτω να γράψεις έναν μικρό parser που θα σου επιστρέφει το πλήθος των tokens που διάβασε, καθώς και ένα array με τα tokens που διάβασε.

 

Οπότε από εκεί και πέρα είναι εύκολο να τα κάνεις treat όπως θέλεις (δηλαδή το 1ο ως Date, το 2ο ως Open, κλπ).

 

Αν το input είναι πάντα πλήρες στο πλήθος των στηλών του, όπως είναι στο αρχείο που δίνεις ως παράδειγμα, μπορείς να πάρεις τα tokens της κάθε γραμμής με απλό sscanf()... βέβαια αν έχεις διαφορετικά locale (αλήθεια από που καταλαβαίνεις το locale? στο αρχείο δείγμα δεν υπάρχει σχετική πληροφορία... ίσως διαβάζεις το locale του client, δεν ξέρω τι ακριβώς κάνεις) τότε μάλλον εξυπηρετεί να κάνεις δικό σου parser.

 

Οπότε κάτι σαν το παρακάτω βολεύει;

init( data, MAX_DATA );
for (i=0; i < MAX_DATA && not eof; i++) {
    read( line )
    ntokens = parser(line, tokens);

    /* get all data[i] fields from tokens array
     (this could be a separate function, e.g.: get_idata(&data[i], tokens) )
     */
    if ( ntokens > 0 )
        data[i].date = get_date(tokens[0]);
    if ( ntokens > 1 )
        data[i].Open = get_open(tokens[1]);
    ...
    if ( ntokens > 6 )
        data[i].adjclose = get_adjclose(tokens[6]);
}
Για κάθε διαφορετικό φορμά αρχείου θα μπορείς να έχεις διαφορετικές parser() και get_idata() συναρτήσεις. Πόσα είναι τα διαφορετικά φορμά input που μπορεί να έχεις; Υποθέτω δεν θα ξεπερνάνε τα 5-6.

 

Νομίζω έτσι βγάζεις πιο κατανοητό και πιο καλά οργανωμένο κώδικα από το να έχεις έναν γενικό parser για όλα τα φορμά (άσε που δεν ξέρω και κατά πόσο είναι εφικτό να κάνεις γενικό parser αν έχεις ανομοιογενή φορμά input).

 

Αν τα delimiters σου είναι κοινά σε όλα τα input σου, κι αλλάζει μονάχα το πλήθος και το είδος των στηλών, θα μπορούσες υποθέτω να έχεις και κάτι σαν table αναγνώρισης για το καθένα τους (για το data δηλαδή), και να το περνάς στην get_idata() για να κάνει assign τιμές στα κατάλληλα πεδία ανάλογα τη μορφή data που διαβάζει την κάθε φορά. Aν και αυτό το generalization μιας ας τη πούμε πιο high-level get_idata() έχει περισσότερο σχεδιαστικό νόημα υπό προϋποθέσεις παρά λειτουργικό.

Δημοσ.

Θα μπορούσες κατ' ελάχιστο να ξεφορτωθείς το πεδίο της regex.

 

Υποθέτοντας πως δεν μπορείς από τα data να δεις τη σειρά των πεδίων (αν μπορούσες τότε πάμε σε fully automated), μπορείς από το πεδίο groups να πάρεις δεδομένα με τα οποία θα φτιάξεις τη regex επιτόπου. Προφανώς το μόνο σου πρόβλημα είναι πώς να σιγουρευτείς ότι χρησιμοποιείς τους σωστούς delimiters (αυτό το κόμμα ειδικά που είναι πανούργο).

 

Λοιπόν αν κάνεις match /(?<=\d)\D(?=\d)/ τα matches που θα πάρεις θα είναι οι πιθανοί delimiters. Συγκεκριμένα, κάνεις group by match reverse sort by count και πρώτο πρώτο έχεις τον delimiter που χρησιμοποιεί το αρχείο σου.

 

Από τη στιγμή που το έχεις αυτό τότε μπορείς απλά να κάνεις το split σε πεδία (σύμφωνα με το group που έδωσες -- btw το date πλέον θα το κάνεις ένα μόνο πεδίο αντί για 3) και στη συνέχεια πολύ εύκολα παρσάρεις τα νούμερα. Για το date/time θα σου πρότεινα να βάλεις μερικά formats (ή να χρησιμοποιήσεις Culture objects έτοιμα με τα format τους) και να δοκιμάσεις διάφορα TryParse. Αν μόνο ένα format ενός culture πετύχει τότε ξέρεις τι είναι. Αν πετύχουν διάφορα format σε πολλά culture τότε απλά κοιτάς μήπως πάρσαραν στο ίδιο αποτέλεσμα οπότε χρησιμοποιείς αυτό. Αν όχι... έλα να ποστάρεις τι έγινε να σκεφτούμε κάτι καλύτερο.  :D

Δημοσ.

, μπορείς από το πεδίο groups να πάρεις δεδομένα με τα οποία θα φτιάξεις τη regex επιτόπου. 

 

Χμμ, καλο ακουγεται.

 

@μιγ δεν θελω τοσο low level, θελω high level, βασικα το θελω πολυ high level, πχ βλεπω αυτα τα δεδομενα. http://bitcoincharts.com/markets/mtgoxUSD_trades.html γραφω ενα regexοειδη και παιρνω τα data on the fly.

Υγ: για το local που λες, δες τους float. Οι μεν ειναι με , και οι δε με .

Δημοσ.

Οκ, απλώς δεν είμαι σίγουρος αν τα . και , σε float είναι ασφαλής συνθήκη για να αποφασίσεις το locale όλων των πεδίων. Δεν θυμάμαι π.χ. αν το . σε float είναι ικανό να σου δώσει ασφαλές συμπέρασμα και για την date (ούτε το αντίστροφο) οπότε τσέκαρέ το ;)

 

ΥΓ. Τελικά η σειρά των στηλών σε ένα είδος input μπορεί να αλλάζει ή όχι; Μπορεί π.χ. σε ίδιο τύπο input να μην έχεις ας πούμε Date και να ξεκινάει με Open; Αν ναι, τότε αυτό που πόσταρα δεν δουλεύει έτσι κι αλλιώς.

Δημοσ.

Ωχ, Παναγια μου... το winapi δεν εχει μια κωλοσυναρτηση για datetime parse...

 

μιγ, εαν αλλαζε η σειρα των στηλων στο ιδιο format.... ε τοτε θα εγραφα τις τιμες μια μια με το χερι :P

Δημοσ.

Ωχ, Παναγια μου... το winapi δεν εχει μια κωλοσυναρτηση για datetime parse..

...

Άμα ξέρεις τα delimiters των locale, κάντες sscanf() από το διαβασμένο token τους.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...